这两天在学习事件与委托,为了加深理解,我编写了一些代码,实现通过事件与委托在线程间通信,但在这个过程中,发现一些情况,有些疑惑,希望看到的前辈能留下您的看法。
程序有两个部分,MainForm和一个WorkThread,实现的动作是WorkThread计数,并在计数后通过事件或委托通知MainForm更新界面。
无论是使用事件还是委托,都能正确实现上述功能。但是在进行跟踪时,通过监视线程执行情况,发现一些问题:使用事件时,更新界面的方法是附着在WorkThread线程中执行的,而使用委托的时候,则是附着在主窗体线程中实现,这是为什么呢?
以下是相关代码片断:
MainForm:
public WorkThread work;
private void Start_Click(object sender, System.EventArgs e)
{
work = new WorkThread ();
work.Notify += new WorkThread .NotifyEventHandler(ShowSample);
}
public void ShowSample(int num)
{
textResult.Text = num.ToString();
}
public class WorkThread
{
public delegate void NotifyEventHandler(int num);
public event NotifyEventHandler Notify;
public Thread myThread;
private main;
public WorkThread(MainForm pForm)
{
main = pForm;
myThread = new Thread(new ThreadStart(Work);
myThread.Start();
}
private void Work()
{
int i = 0;
object[] args = new object[1];
while(true)
{
Thread.Sleep(1000);
args[0] = i;
//main.BeginInvoke(new NotifyEventHandler(main.ShowSample),args); //使用委托
Notify(index,i); //使用事件
i++;
}
}
}