2011-08-02 30 views
1

我是一個C#新手,對我很裸露。我創建了一個後臺線程來完成一些工作,最後我調用了引發事件的方法ThreadDone(threadWorkResult)。目前,事件處理程序在相同的後臺線程上運行,但我希望它在主UI線程(Forms應用程序)上運行。我在網上搜索,發現有關使用屬性here的一些信息,但想知道如何以編程方式執行此操作。有沒有辦法可以在處理程序本身之外完成?在主線程上處理背景事件

再次感謝!

編輯

我看着的BackgroundWorker,但我不得不一次創建多個線程,這樣所有的各個OnWorkerCompleted事件處理程序變得相當混亂;更重要的是,並非所有人都需要完成的事件。最糟糕的情況我會使用幾個BackgroundWorkers,但是我可能只需從後臺線程調用一個方法(void aMethod())並強制它在主UI線程上運行?

+0

@ Jon:+1我按照您的編輯更新了我的答案。希望有幫助... – CharithJ

回答

0

我會建議您使用BackgroundWorker線程進行後臺工作,然後您可以輕鬆處理OnWorkerCompleted事件中的用戶界面。

看看我的回答here瞭解更多信息。

編輯

您可以使用委託交出一些任務MainUI線程。

public delegate void MyDelegate(object paramObject); 

在後臺線程中調用它如下。

private void aMethod(object myParam) 
{ 
    if (InvokeRequired) 
    { 
     // We're not in the UI thread, so we need to call BeginInvoke 
     BeginInvoke(new MyDelegate(aMethod), new object()); 
     return; 
     } 

     // Must be on the UI thread if we've got this far. 
     // Do UI updates here.  
} 

請參閱參考資料herehere

+0

感謝您的回覆!我可能會錯過一些東西,但沒有'InvokeRequired'(和'BeginInvoke')需要調用一個控件(即'aControl.InvokeRequired')?另外,你調用的'MyDelegate'具有void(void)的簽名,但正在傳遞'object value'作爲參數。這可能嗎?而且,你的意思是在'BeginInvoke'中寫'UpdateMyUI'而不是'UpdateStatus'嗎?就像我之前提到的那樣,我對C#很陌生,所以如果我剛剛問了一些(或幾個)愚蠢的問題,我很抱歉。 :) – john

+0

@ Jon:謝謝你指出我的錯誤。我發佈了未經測試的代碼。 aControl.InvokeRequired是可能的。 – CharithJ

2

在Windows窗體控件上有一個名爲BeginInvoke的方法,它將在GUI線程中執行代碼。