2

我有一个包含十种方法的按钮单击。在这里,我想在按钮单击或代码中的某些位置使用线程,这样我的 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()我得到一个异常,上面写着“一个组合框是从线程访问的,而不是它在其上创建的”

感谢您的耐心..任何帮助将不胜感激..

4

3 回答 3

0

你需要的是一个代表!您只需创建一个委托并将其放入从线程函数访问 GUI 的函数中。

public delegate void DemoDelegate();

在您的代码中,

collectionListOfPtags()
{
    if ((this.InvokeRequired)) {
    this.Invoke(new DemoDelegate(collectionListOfPtags));
    return;
    }

     // Your Code HERE
}

我希望这会奏效!祝你好运 :-)

于 2013-04-05T11:49:18.770 回答
0

这看起来很适合该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,但将UpdateUI在 UI 线程上运行,以便您可以ComboBox正确访问。

于 2013-04-05T11:55:20.197 回答
0

你应该看看线程池?线程池是线程的集合,可用于在后台执行多个任务。它们使用简单且线程安全。

这是一个(非常简单的)示例:http: //msdn.microsoft.com/en-us/library/h4732ks0.aspx

于 2013-04-05T13:09:58.077 回答