关于c#中的线程
本文关键字:线程 关于 | 更新日期: 2023-09-27 18:07:28
我有一个按钮点击,其中包含一些十个方法。在这里,我想在按钮点击或代码中的某些地方使用线程,以便我的windows窗体应用程序不会挂起。
这是我迄今为止所尝试的…!!
collectListOfPTags();
REqDocCheck = new Thread(new ThreadStart(collectListOfPTags));
REqDocCheck.IsBackground = true;
REqDocCheck.Start();
WaitHandle[] AWait = new WaitHandle[] { new AutoResetEvent(false) };
while (REqDocCheck.IsAlive)
{
WaitHandle.WaitAny(AWait, 50, false);
System.Windows.Forms.Application.DoEvents();
}
在方法collectionListOfPtags()
中,我得到一个异常,说"从线程访问组合框,而不是创建在"
这看起来很适合BackgroundWorker
组件。
把你的collectListOfPTags
方法分成2个方法-第一个收集和处理数据,第二个更新UI控件。
像这样:
void OnClick( ... )
{
var results = new List<string>();
var bw = new BackgroundWorker();
bw.DoWork += ( s, e ) => CollectData( results );
bw.RunWorkerCompleted += ( s, e ) => UpdateUI( results );
bw.RunWorkerAsync();
}
void CollectData( List<string> results )
{
... build strings and add them to the results list
}
void UpdateUI( List<string> results )
{
... update the ComboBox from the results
}
BackgroundWorker
将在后台线程池线程上运行CollectData
,但将在UI线程上运行UpdateUI
,因此您可以正确访问ComboBox
。
你需要的是一个委托!你只需要创建一个委托,并把它放在从线程函数访问GUI的函数中。
public delegate void DemoDelegate();
在你的代码中,
collectionListOfPtags()
{
if ((this.InvokeRequired)) {
this.Invoke(new DemoDelegate(collectionListOfPtags));
return;
}
// Your Code HERE
}
我希望这将工作!祝你好运:-)
你应该看看线程池?线程池是可用于在后台执行若干任务的线程的集合。它们使用简单,线程安全。
这里有一个(非常简单的)例子:http://msdn.microsoft.com/en-us/library/h4732ks0.aspx