3

以下代码使 UI 线程挂起。

    private void button1_Click(object sender, EventArgs e)
    {
        Thread t = new Thread(Func);
        t.Start();
    }

    private void Func()
    {
        this.Invoke((Action)(() =>
        {
            while (true);
        }));
    }

我希望Func()每次单击按钮时都在不同的工作线程中调用,而不会冻结任何 UI 线程。

最好的解决方法是什么?

4

2 回答 2

3

使用您的代码while(true)在 UI 线程上运行,这就是阻止您的 UI 的原因。

while(true)放出Invoke方法,所以每当你想改变 UI 时,把改变 UI 的代码块放在里面Invoke

private void button1_Click(object sender, EventArgs e)
{
    Thread t = new Thread(Func);
    t.Start();
}

private void Func()
{
    while(true)
    {
       this.Invoke((Action)(() =>
        {
            textBox.Text = "abc";
        }));
    } 
}
于 2012-10-25T05:57:42.960 回答
2

Func() 代码确实在非 UI 线程上运行。但是,this.Invoke然后在 UI 线程上执行 Action!。

尝试这样的事情:

void Func()
{
     // Do some work.

     // Update the UI (must be on UI thread)
     this.Invoke(Action) (() =>
     {
        // Update the UI.
     }));
 }

我可能会更好地使用该BeginInvoke方法。这样,非 UI 线程就不会等待 UI 线程执行操作。

此外,您没有异常捕获或进度报告逻辑。我建议看BackgroundWorker课程;http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

void button1_Click(object sender, EventArgs e)
{
   var worker = new BackgroundWorker();
   worker.DoWork += (s,e) =>
   {
       // Do some work.
   };
   worker.RunWorkerCompleted += (s,e) =>
   {
       // Update the UI.
   }
   worker.RunWorkerAsync();
}
于 2012-10-25T05:57:48.333 回答