在两个线程之间进行通信

Hoo*_*och 0 .net c# events multithreading backgroundworker

我有这样的感觉.它给了我错误.我删除了所有不需要的代码部分.它给了我这个错误

The calling thread cannot access this object because a different thread owns it.
Run Code Online (Sandbox Code Playgroud)
 public partial class MainWindow : Window
{
    BackgroundWorker worker;
    Grafik MainGrafik;

    double ProgressBar
    {
        set { this.progressBarMain.Value = value; }
    }

    public MainWindow()
    {
        InitializeComponent();
        worker = new BackgroundWorker();
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);

        MainGrafik = new Grafik();
        MainGrafik.ProgressUpdate += 
            new Grafik.ProgressUpdateDelegate(MainGrafik_ProgressUpdate);

        worker.RunWorkerAsync();
    }

    void MainGrafik_ProgressUpdate(double progress)
    {
        ProgressBar = progress;
    }


    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        while(true)
        {
            MainGrafik.Refresh();
            Thread.Sleep(2000);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
class Grafik
{
    public delegate void ProgressUpdateDelegate(double progress, 
        DateTime currTime);
    public event ProgressUpdateDelegate ProgressUpdate;

    public void Refresh()
    {
            ProgressUpdate(5); // Just for testing
    }
}
Run Code Online (Sandbox Code Playgroud)

pst*_*jds 8

您无法从其他线程更新UI对象.它们必须在UI线程中更新.尝试将此代码添加到MainGrafik_ProgressUpdate(双重进度)

void MainGragfik_ProgressUpdate(double progress)
{
    if (InvokeRequired)
    {
         BeginInvoke((MethodIvoker)(() =>
         {
             MainGragfik_ProgressUpdate(progress);
         }));

         return;
    }

    ProgressBar = progress;
}
Run Code Online (Sandbox Code Playgroud)