2015-07-01 34 views
0

我使用的是後臺工作者,因爲我的程序中的某些方法需要時間從互聯網上下載數據。這種方法「阻塞」5-6秒的軟件,所以我想用後臺工作者來執行線程的方法。在我的課堂我已經創建此:BackgroundWorker工作不正常

private BackgroundWorker worker = new BackgroundWorker(); 

,後組合框選擇改變了,我叫BackgroundWorker的這樣:

worker.DoWork += new DoWorkEventHandler(doWork); 

的方法的doWork包含:

public void doWork(object sender, DoWorkEventArgs e) 
{ 
     classifica.getClassifica(); //call the method from another class 
} 

現在我的問題是BackgroundWorker沒有調用方法doWork。 我做錯了什麼?

+3

你開始了嗎?此外,您不需要BackgroundWorker在後臺運行某些內容。首選的方法是使用'async/await'來創建一個異步事件處理程序。 –

+0

調用worker.DoWork不會自動啓動? –

+0

不,您需要在工作對象上調用'RunWorkerAsync' –

回答

0

我認爲你正在尋找這樣的:

if (worker.IsBusy != true) 
{ 
    worker.RunWorkerAsync(); 
} 

雖然除非你設置一個BackgroundWorker或不能TA rget .NET 4.5,那麼我強烈推薦WebClient.DownloadDataAsync

使用這樣的:

static void DownloadData() 
{ 
    string url = "http://google.com"; 
    WebClient client = new WebClient(); 
    client.DownloadDataCompleted += DownloadDataCompleted; 
    client.DownloadDataAsync(new Uri(url)); 
} 

static void DownloadDataCompleted(object sender, 
DownloadDataCompletedEventArgs e) 
{ 
    // Handle returned data here 
} 

,這一切對你不使用其他任何東西。簡單!

1

你必須開始工作。

worker.RunWorkerAsync(); 
0

您必須致電worker.RunWorkerAsync();啓動工作人員。 還有過載,讓您的object參數傳遞到您的DoWork功能:

void RunWorkerAsync(object argument) 

您還可以添加一個處理程序,以便當工作完成後,你就會知道:worker.RunWorkerCompleted。在此處理程序可以訪問數據網格,因爲它會在UI線程(假設你創建在UI線程的工人)

+0

我已經執行了worker.RunWorkerAsync(),但該方法未被執行。 –

+0

您是否在添加DoWork處理程序後調用它? – edtheprogrammerguy

+0

另外@HaroldFinch,確保主程序在處理程序有機會執行之前不會退出。 – edtheprogrammerguy