关于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()中,我得到一个异常,说"从线程访问组合框,而不是创建在"

谢谢你的耐心。

关于c#中的线程

这看起来很适合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