跨线程调用问题

原创 2015年11月20日 10:04:56

如果一个方法被一个线程调用,由于业务需要,另一个线程也需要用到这个方法怎么办呢?

如果直接在另一个线程中调用该方法,不一定会报错,但是肯定不会执行,因此很难发现问题出在哪里。

本菜目前知道2种方法:1、用委托,看起来比较高大上一点;2、直接另写一个方法,绕过其线程(局限性非常大,如果是语言自身的消息机制等根本就绕不过)

下面我根据C# Winform的用其他线程更改提示框信息把第一种方法写一下吧!

首先添加一个借口:

    /// <summary>
    /// 消息接口
    /// </summary>
    public interface IShowMessage
    {
        /// <summary>
        /// 展示信息
        /// </summary>
        /// <param name="Message_"></param>
        void Message(object Message_);
    }

同时定义一个委托:

 /// <summary>
    /// 消息机制
    /// </summary>
    /// <param name="Message_"></param>
    public delegate void ShowMessages(object Message_);


然后让winform继承这个接口

public partial class frmTest : Form, IShowMessage



此时就需要重新借口的 Message方法啦!注意下面红色标记的正是上文中定义的委托。

    public void Message(object Message_)
        {            
            ShowMessages Show = new ShowMessages(M);
            if (Show != null)
                this.Invoke(Show, Message_);
        }

如果直接传message为string的话,只要下面写一下M函数就完事了啦!

   private void M(object Message_)
        {
            //var message = new { Message = "", date = new DateTime() };
            //message = Message_.ToAnonymous(message);
            //txtMsg.AppendText("\r\n" + message.date + "\r\n" + message.Message);
            txtMsg.AppendText(message);
        }

如果要传多个参数(如上文中注释的代码):如下得重写一下字符串扩展StringExtend

 /// <summary>
    /// 字符串扩展方法
    /// </summary>
    public static class StringExtend
    {
        /// <summary>
        /// 匿名类的转化,转换成对应的格式
        /// </summary>
        /// <typeparam name="T">匿名类的类型</typeparam>
        /// <param name="Value_">数据</param>
        /// <param name="t_">匿名类的类型</param>
        /// <returns></returns>
        public static T ToAnonymous<T>(this object Value_, T t_)
        {
            return (T)Value_;
        }
    }

这样我们就可以把Message_定义为一个对象,包含2个或多个参数:new { Message = "", date = new DateTime() };



调用方法:在需要调用到的线程类中定义接口对象:如下重写一个方法ShowMessage()通过接口调用Message()方法

IShowMessage _IShow = null;

/// <summary>
        /// 显示消息
        /// </summary>
        /// <param name="Message_"></param>
        /// <param name="time_"></param>
        private void ShowMessage(string Message_, DateTime time_)
        {
            var message = new { Title = Message_, Date = DateTime.Now };
            _IShow.Message(message);
        }

调用只要写:

ShowMessage("出现异常", DateTime.Now);

便可以在其他线程中更改winform线程下的消息框信息了!





版权声明:本文为博主原创文章,未经博主允许不得转载。

C#线程安全和跨线程问题

  • 2016年07月12日 18:01
  • 218KB
  • 下载

多线程委托之跨线程问题分析--在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke(解决方法已更新)

多线程委托之跨线程问题分析 今天在写一个程序测试运行跨线程同步的时候出一个异常信息。 异常信息:System.InvalidOperationException “在创建窗口句柄之前,不能在控件上调...

C#跨线程调用窗体控件的问题

前段时间遇到跨线程调用窗体控件的问题,其实一句话System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;就可以解决,但...

MFC中跨线程UpdateData(FALSE)报错 ASSERT FAILD问题

文章来自:http://hi.baidu.com/yu_xiyan/item/27f82bf1a1cc0813d7ff8c8c MFC程序,在给控件关联的变量赋值后,需要调用UpdateData(F...

[BUG分享]搜狗浏览器跨线程使用IE接口的问题

搜狗浏览器1.0时,如果新建多个标签页浏览页面时,偶尔会出现工具栏的前进、后退、刷新等按钮为彩色可点击状态,但是点击之后页面却没有发生相应的动作,造成这一问题原因是COM组件的列集和散集使用不当。...

有关cocos2dx游戏中复制与粘贴的问题(跨线程的操作)

主要解决游戏中粘贴的跨线程的问题,对于需要适配大多数安卓机的可以参考...

跨线程调用控件示例

  • 2012年02月20日 12:57
  • 49KB
  • 下载

VB2008串口收发+跨线程调用

  • 2014年03月31日 21:47
  • 205KB
  • 下载

java中,多个线程同时调用同一个静态方法的问题

我的原来程序是这样设计的,对于一些常用的方法,都用静态方法来实现,在多线程程序中直接调用,静态方法由于没有使用静态变量,所以没有进行线程同步。 类似以下程序: class ThreadI ...

MTA客户跨线程调用STA对象

  • 2014年08月26日 20:31
  • 28KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:跨线程调用问题
举报原因:
原因补充:

(最多只允许输入30个字)