跨线程调用问题

原创 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线程下的消息框信息了!





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

Qt的事件和与Widget跨线程交互

一般gui的程序的模型总有至少两个主要线程,一个是界面的主事件循环所在的线程,另一个是处理工作任务的线程,工作线程看不见,在后台处理事务产生数据,然后显示在界面上。例如一个即时通讯客户端,主界面显示好...
  • gu_87_2008
  • gu_87_2008
  • 2013年06月18日 10:59
  • 1147

《C#编程之道》 之 如何跨线程调用Windows窗体控件

推荐下载:《C#编程词典》体验版,免费享用最全的编程资源     在开发具有线程的应用程序时,有时会通过子线程实现Windows窗体,以及控件的操作,比如:在对文件进行复制时,为了使用户可以更好的观察...
  • MR_abc
  • MR_abc
  • 2010年09月06日 18:16
  • 4066

c#如何跨线程调用窗体控件

要从其他跨线程存取调用控件,可采用以下两种方法之一: 方法1)不进行线程安全的检查 方法2)通过委托的方式 代码如下所示 1 2 3 4 5 6 7 8 9...
  • angel20082008
  • angel20082008
  • 2014年04月13日 12:31
  • 2923

WinForm(C#)中跨线程访问控件的解决方法

由于多线程可能导致对控件访问的不一致,导致出现问题。C#中默认是要线程安全的,即在访问控件时需要首先判断是否跨线程,如果是跨线程的直接访问,在运行时会抛出异常。 解决办法有两个: 1、不进...
  • SunCherryDream
  • SunCherryDream
  • 2014年10月11日 08:44
  • 1666

跨线程问题

一、窗口的跨线程问题       MFC中,窗口不能跨线程绘制,不能跨线程更新,不能跨线程创建。简单的说,不能跨线程访问MFC窗口对象,MFC句柄封装类只在创建句柄的线程中有效,在其它线程中访问会出现...
  • bookish_2010_prj
  • bookish_2010_prj
  • 2011年01月08日 14:49
  • 1785

如何跨线程调用Windows窗体控件

 在开发具有线程的应用程序时,有时会通过子线程实现Windows窗体,以及控件的操作,比如:在对文件进行复制时,为了使用户可以更好的观察到文件的复制情况,可以在指定的Windows窗体上显示一个进度条...
  • loverszhaokai
  • loverszhaokai
  • 2010年12月12日 21:06
  • 4300

C# 关于跨线程访问控件问题

所谓跨线程调用控件就是一个线程调用另外一个线程的控件。 常见使用情况,比如:当我们开了一个在后台监听消息的线程以后,需要将消息内容添加到主窗体的消息框内显示出来。 这时候,我们就需要使用跨线程...
  • linyujie0927
  • linyujie0927
  • 2017年05月14日 22:31
  • 439

WPF跨线程调用和Dispatcher

在winform中默认不允许跨线程操作控件,但可通过设置控件属性CheckForIllegalCrossThreadCalls = false。在WPF中同样也是禁止跨线程操作控件的,会提示“调用线程...
  • lwwl12
  • lwwl12
  • 2017年07月29日 17:48
  • 268

Winform 让跨线程访问变得更简单

前言 由于多线程可能导致对控件访问的不一致,导致出现问题。C#中默认是要线程安全的,即在访问控件时需要首先判断是否跨线程,如果是跨线程的直接访问,在运行时会抛出异常。近期在项目中碰到这个问题,首先...
  • dyllove98
  • dyllove98
  • 2013年07月15日 21:34
  • 9513

VB.net应用技巧4: 跨线程调用控件

在VB.net应用技巧3中,说明在线程中访问控件是不安全的,本文介绍在线程中安全访问控件的方法。安全访问控件的主要方法是使用委托,即在窗体中完成对控件的调用。     1、定义委托。   ...
  • qingwufeiyang12346
  • qingwufeiyang12346
  • 2017年02月02日 14:55
  • 1022
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:跨线程调用问题
举报原因:
原因补充:

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