c#多线程访问界面

王朝学院·作者佚名  2009-11-20  
宽屏版  字体: |||超大  

C#2005后不再支持多线程直接访问界面的控件(界面创建线程与访问线程不是同一个线程),不过可以使用delegate来解决:

1. 声明一个delegate和定义一个delegate的实现函数

view plaincopy to clipboardprint?

delegate void ShowProgressDelegate(int newPos);

private void ShowProgress(int newPos)

{

// 判断是否在线程中访问

if (!_progressBar.InvokeRequired)

{

// 不是的话直接操作控件

_progressBar.Value = newPos;

}

else

{

// 是的话启用delegate访问

ShowProgressDelegate showProgress = new ShowProgressDelegate(ShowProgress);

// 如使用Invoke会等到函数调用结束,而BeginInvoke不会等待直接往后走

this.BeginInvoke(showProgress, new object[] { newPos });

}

}

delegate void ShowProgressDelegate(int newPos);

private void ShowProgress(int newPos)

{

// 判断是否在线程中访问

if (!_progressBar.InvokeRequired)

{

// 不是的话直接操作控件

_progressBar.Value = newPos;

}

else

{

// 是的话启用delegate访问

ShowProgressDelegate showProgress = new ShowProgressDelegate(ShowProgress);

// 如使用Invoke会等到函数调用结束,而BeginInvoke不会等待直接往后走

this.BeginInvoke(showProgress, new object[] { newPos });

}

}

2. 定义线程函数(在另一个线程中可以对界面控件进读操作)

view plaincopy to clipboardprint?

private void ProgressStart()

{

while (true)

{

int newPos = _progressBar.Value + 10;

if (newPos > _progressBar.Maximum)

{

newPos = _progressBar.Minimum;

}

Trace.WriteLine(string.Format("Pos: {0}", newPos));

// 这里直接调用方法,由其内部自动判断是否启用delegate

ShowProgress(newPos);

Thread.Sleep(100);

}

}

private void ProgressStart()

{

while (true)

{

int newPos = _progressBar.Value + 10;

if (newPos > _progressBar.Maximum)

{

newPos = _progressBar.Minimum;

}

Trace.WriteLine(string.Format("Pos: {0}", newPos));

// 这里直接调用方法,由其内部自动判断是否启用delegate

ShowProgress(newPos);

Thread.Sleep(100);

}

}

3. 线程的启动和终止

view plaincopy to clipboardprint?

private Thread _progressThread;

_progressThread = new Thread(new ThreadStart(ProgressStart));

// 可选,功用:即使该线程不结束,进程也可以结束

_progressThread.IsBackground = true;

_progressThread.Start();

_progressThread.Abort();

// 可选,功用:等到线程结束才继续

_progressThread.Join();

_progressThread = null;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有