2010-11-17 120 views
0

我就是這樣的。它給了我錯誤。我刪除了所有不需要的代碼部分。它給我這個錯誤兩條線程之間的溝通

The calling thread cannot access this object because a different thread owns it. 

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); 
     } 
    } 
} 

class Grafik 
{ 
    public delegate void ProgressUpdateDelegate(double progress, 
     DateTime currTime); 
    public event ProgressUpdateDelegate ProgressUpdate; 

    public void Refresh() 
    { 
      ProgressUpdate(5); // Just for testing 
    } 
} 
+0

如果要舉報你可以使用進度[ 'BackGroundWorker.ReportProgress'](http://msdn.microsoft.com/en-us/library/ka89zff4.aspx)。 – 2010-11-17 20:03:59

回答

8

您無法更新從另一個線程的UI對象。他們必須在UI線程中更新。嘗試將此代碼添加到MainGrafik_ProgressUpdate(雙進程)

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

     return; 
    } 

    ProgressBar = progress; 
} 
0

觸發ProgressUpdate事件的線程是您的BackgroundWorker。 ProgressUpdate事件處理程序可能在該線程上運行,而不是UI線程。

0
在你的其他線程的執行上下文的形式在短時間內調用此

void MainGrafik_ProgressUpdate(object sender, EventArgs e) { 
    Action<T> yourAction =>() yourAction;    

    if(yourForm.InvokeRequired) 
     yourForm.Invoke(yourAction); 
    else yourAction; 

    } 

或用MethodInvoker(空白代表)

void MainGrafik_ProgressUpdate(object sender, EventArgs e) { 
    MethodInvoker invoker = delegate(object sender, EventArgs e) { 

     this.ProgressBar = whatever progress; 
    };   


    }