作者reptile0426 ( )
看板C_Sharp
标题Re: [问题] delegate.BeginInvoke跟control.invoke …
时间Wed Nov 21 17:41:27 2007
我看到手残将我的title打错
是delegate.BeginInvoke & Control.BeginInvoke的不同
我先跟toki大说声对不起~~
※ 引述《toki (いまがその时だ)》之铭言:
: ※ 引述《reptile0426 ( )》之铭言:
: : 我上网看了一下
: : 发现他们不同的地方"好像是" 唤起的thread不同
: 就我所知,Control.Invoke 和 Control.BeginInvoke 做的事都一样
: 都是将 delegate 排进 UI Thread 呼叫
: 但是不同之处
: Invoke - 会等到 Invoke 的 delegate function return (Sync)
: BeginInvoke - 射後不理 (Async)
: (其实不能完全说不理,他有回传 IAsyncResult 物件给你等结果
: 说非同步执行比较正确)
: : 但是我又对worker thread这个东西有点疑问
: : 它不是UI thread,那他是什麽东西
: : 一个windows form程式除了本身的main thread之外,背後还有一个worker thread
: : 然後又冒出一个threadpool,这更让我想了解c#观念 越来越模糊
: : 想请问一下各位前辈,可以指导小弟观念上的问题
: : 谢谢各位
: Form 在运作的时候,本身有一个 UI Thread 负责更新 UI 及收 Windows Message
: 但是目前 .NET 所有的 Control 物件都非 Thread-safe object
: 所以由别的 Thread 来的呼叫都必需透过 Invoke delegate 的方式,来转换成在
: UI Thread 执行
: 要举例的话,就是你开了一个背景 thread ,里面跑了一个 socket server
: 你希望有 client 连上的时候更新 label1.Text,所以你把 server 的 OnConnect
: 连结到 Form 上的某个 function
: void OnClientConnect(string clientName)
: {
: label1.Text = clientName;
: }
: 但是红色这行会出现 exception,因为这个 function 是由背景 thread 的 server 呼叫的
: Form为了逼免跨 thread 存取的问题,会 throw exception 拦下来
: 正确写法会是
: delegate void CommonTextFuncDlg(string value);
: void OnClientConnect(string clientName)
: {
: if (InvokeRequired)
: {
: Invoke(new CommonTextFuncDlg(OnClientConnect), clientName);
: return;
: }
: label1.Text = clientName;
: }
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 163.25.101.28