提问者:小点点

多线程任务更新1 progressbar-UI C#WPF


我一直在四处寻找有类似问题的人,但没有找到任何东西。我正在编写一个使用WPF UI的C#应用程序。

为了更新progressbar,我不能像以前一样(在CLI中)使用多线程,因为它告诉我,如果UI元素不来自主线程,我就不能更新它。

一个解决方案是创建后台工作者。我已经实现了这个解决方案,它工作得很好,但是我希望将任务分配给更多的工作者/线程(多线程),以提高效率。

我不知道我该走的方向。如果有人能告诉我这个问题,那将是更受欢迎的。

这里是我的代码:(用来用MVVM模式编码,只是在这里粘贴我的代码,对你来说更简单)

public partial class testFunctionTaskPanel: Page
{
    private BackgroundWorker backgroundWorker1 = new BackgroundWorker();

    private string myURL;

    public testFunctionTaskPanel()
    {
        InitializeComponent();
    }

    private void startButton_Click(object sender, RoutedEventArgs e)
    {
        myURL = myURL.Text;

        myResults.Items.Clear();
        myResults.Items.Add("----Starting----");

        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.ProgressChanged += ProgressChanged;
        backgroundWorker1.DoWork += DoWork;
        backgroundWorker1.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
        backgroundWorker1.RunWorkerAsync();
    }

    private void DoWork(object sender, DoWorkEventArgs e)
    {
        int length = myLoadedList.Items.Count;


        for (int i = 1; i <= length; i++)
        {
            try
            {
                HttpRequest req = new HttpRequest();
                req.Proxy = null;
                req.ConnectTimeout = 5000;
                req.IgnoreProtocolErrors = true;

                string get = myURL + myLoadedList.Items[i].ToString();
                var response = req.Get(get);

                if (response.StatusCode == Leaf.xNet.HttpStatusCode.OK)
                {
                    this.Dispatcher.Invoke(() =>
                    {
                        myResults.Items.Add(myLoadedList.Items[i].ToString());
                    });
                }
            }
            catch{}
            backgroundWorker1.ReportProgress(i);
        }
    }

    private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        myResults.Items.Add("----Finish----");
    }

    private void ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        // This is called on the UI thread when ReportProgress method is called
        progressbar.Value = e.ProgressPercentage;
    }
}

共1个答案

匿名用户

您可以使用dispatcher.invoke():

Dispatcher.Invoke(() =>
{
    // Your code here
});

当您在您的线程或任务中时,只需调用它并将UI更新代码粘贴到其中。