作者toki (いまがその时だ)
看板C_Sharp
标题Re: [问题] delegate.BeginInvoke跟control.invoke不同
时间Wed Nov 21 17:34:45 2007
※ 引述《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: 220.135.108.91
※ 编辑: toki 来自: 220.135.108.91 (11/21 17:35)
※ 编辑: toki 来自: 220.135.108.91 (11/21 17:37)