C_多线程函数如何传参数和返回值[文].pdfVIP

  • 5
  • 0
  • 约7.21千字
  • 约 4页
  • 2021-10-13 发布于福建
  • 举报

C_多线程函数如何传参数和返回值[文].pdf

C# Delegate/ 委托 与多线程 Learning , by 木公 . 最近写到两个程序都用到了多线程,但是由于需要调用主线程 UI ,所以总是会出错, Google 了一下, 终于找到了使用 Delegate( 委托 )的解决方法,现在贴出来存档并且分享: 很多时候写 windows 程序都需要结合多线程,在 .net 中用如下得代码来创建并启动一个新的线程。 public void ThreadProc () ; Thread thread = new Thread ( new ThreadStart ( ThreadProc )) ; thread. IsBackground = true ; thread. Start () ; 但是很多时候,在新的线程中,我们需要与 UI 进行交互,在 .net 中不允许我们直接这样做。可以参考 MSDN 中的描述: “Windows 窗体”使用单线程单元 (STA) 模型,因为“ Windows 窗体”基于本机 Win32 窗口, 而 Win32 窗口从本质上而言是单元线程。 STA 模型意味着可以在任何线程上创建窗口, 但窗口一旦创建 后就不能切换线程,并且对它的所有函数调用都必须在其创建线程上发生。除了 Windows 窗体之外, . NET Framework 中的类使用自由线程模型。 STA 模型要求需从控件的非创建线程调用的控件上的任何方法必须被封送到(在其上执行)该控件的 创建线程。基类 Control 为此目的提供了若干方法( Invoke 、BeginInvoke 和 EndInvoke )。Invoke 生成同步方法调用; BeginInvoke 生成异步方法调用。 Windows 窗体中的控件被绑定到特定的线程,不具备线程安全性。因此,如果从另一个线程调用控件 的方法,那么必须使用控件的一个 Invoke 方法来将调用封送到适当的线程。 正如所看到的,我们必须调用 Invoke 方法,而 BeginInvoke 可以认为是 Invoke 的异步版本。调用方 法如下: public delegate void OutDelegate ( string text ) ; public void OutText ( string text ) { txt. AppendText ( text ) ; txt. AppendText ( tn ) ; } OutDelegate outdelegate = new OutDelegate ( OutText ) ; this . BeginInvoke ( outdelegate, new object []{ text }) ; 如果我们需要在另外一个线程里面对 UI 进行操作,我们需要一个类似 OutText 的函数,还需要一个该 函数的委托 delegate ,当然,这里展示的是自定义的, .net 中还有很多其他类型的委托,可以直接使用, 不需要而外声明。例如: MethodInvoker 和 EventHandler ,这两种类型委托的函数外观是固定的, Met hodInvoker 是 void Function() 类型的委托,而 EventHandler 是 void Function(object, EventArgs) 类型的委托,第一个不支持参数,第二中的参数类型和数量都是固定的,这两种委托可以很方便的调用, 但是

文档评论(0)

1亿VIP精品文档

相关文档