不能获取WPF UI线程权

问题描述 投票:1回答:1

我建立概念的应用证明它会部署到真正的人之前。

场景我应该能够在它的中间停止处理。

工具栏2个按钮“开始”和“停止”

用户按下启动并处理长期运行的任务。用户决定出蓝色的停止任务。

我似乎无法得到正确的线程!因为它是等待长时间运行的任务,如果长时间运行的任务实际上是在UI线程上运行,而不是在后台线程作为intented我不能按停止。

我在做什么错,你可以发现它?谢谢你的帮助

public partial class TestView : UserControl
{

    private readonly BackgroundWorker _worker;


    public TestView 
    {
        InitializeComponent(); 
        _worker = new BackgroundWorker();
        _worker.RunWorkerCompleted += RunWorkerCompleted;
        _worker.DoWork+=DoWork;
        _worker.WorkerReportsProgress = true;
        _worker.ProgressChanged+=_worker_ProgressChanged;
        _worker.WorkerSupportsCancellation = true;
    }


    static void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Cancelled)
        {
            MessageBox.Show("The task has been cancelled");
        }
        else if (e.Error != null)
        {
            MessageBox.Show("Error. Details: " + e.Error);
        }
        else
        {
            MessageBox.Show("The task has been completed. Results: " + e.Result);
        }
    }
    private delegate void SimpleDelegate();
    void DoWork(object sender, DoWorkEventArgs e)
    {
        for (var i = 0; i < 1000000; i++)
        {
            _worker.ReportProgress(i, DateTime.Now); 
           // SimpleDelegate simpleDelegate = () => txtResult.AppendText("Test" + System.Environment.NewLine);

            //Dispatcher.BeginInvoke(DispatcherPriority.Normal, simpleDelegate);
        }

        MessageBox.Show("I have done it all");
    }
    private void _worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        DateTime time = Convert.ToDateTime(e.UserState); 
        txtResult.AppendText(time.ToLongTimeString());
        txtResult.AppendText(Environment.NewLine);
    }

    private void BtnStart_Click(object sender, RoutedEventArgs e)
    {
        _worker.RunWorkerAsync();
    }

    private void BtnStop_Click(object sender, RoutedEventArgs e)
    {
        _worker.CancelAsync();
        MessageBox.Show("Process has been stopped!");
    }
}
wpf
1个回答
3
投票

你的DoWork内运行一个非常紧密的循环,不断推调用ProgressUpdates主线程。这将使它缓慢。

但真正的问题是,DoWork的在取消合作:

void DoWork(object sender, DoWorkEventArgs e)
{       
   for (var i = 0; i < 1000000; i++)
   {
      if (_worker.CancelationPending)
      {
         e.Cancel = true;
         break;  // or: return to skip the messagebox
      }
      _worker.ReportProgress(i, DateTime.Now); 
   }

   MessageBox.Show("I have done it all");  // remove or make depend on Cancelled
}
© www.soinside.com 2019 - 2024. All rights reserved.