2017-04-01 31 views
-4

我正在製作一個管理庫的應用程序。目前,我正在編寫這些書籍的研究代碼,並且我剛剛遇到了一個問題。除了處理其餘執行的內容外,我還創建了一個處理此研究的線程。我在問自己,有沒有可能一個線程管理多種方法?如果是這樣,你怎麼能這樣做,因爲你只能在線程的聲明中放置一個方法。例如,當用戶按下搜索按鈕(在menubox中)時,我只想讓應用程序(通過我的researchThread)轉到url,運行goToUrl()方法。然後,當用戶按下搜索按鈕(在書寫本書的關鍵詞之後),我想讓同一個線程運行另一種方法(search()方法)。由於我不想爲每個功能創建一千個線程(因爲我認爲這不是正確的解決方案),我該如何處理這種情況?提前致謝。多種方法的C#線程

+4

只要瞭解[異步/等待](https://msdn.microsoft.com/en-us/library/mt674882.aspx)功能,並且不必擔心線程管理。你只能在非常特殊的情況下手動處理線程,並且從你寫的東西我猜這不是這種情況。 –

回答

2

使用Task類代替線程。不必要地使用線程。使用任務將運行您的代碼異步。您也可以使用Async and Await關鍵字。

public void Start() 
    { 
     //Create Task with parameter 
     Task search = new Task(() => new Action<int>(SomeSearchMethod)(4)); 

     // Create Normal Task 
     Task download = new Task(SomeDownloadMethod); 

     // Create Task with Return value    
     Task<string> proccessString = Task.FromResult(SomeProcessing()); 
     MessageBox.Show(proccessString.Result); 

     // Start Task 
     search.Start(); 
     download.Start(); 

     // Wait untill task finisht 
     search.Wait(); 
     download.Wait(); 
     /* or for both tasks*/ 
     Task.WaitAll(); 
    } 

    private void SomeDownloadMethod() 
    { 
     //logic 
    } 

    private void SomeSearchMethod(int value) 
    { 
     MessageBox.Show("Parameter Search" + value.ToString()); 
    } 

    private string SomeProcessing() 
    { 
     return "Proccess"; 
    } 
+0

謝謝,但如果我的方法有一個參數,我該怎麼辦。我嘗試使用某個代碼,但有一個例外,說我無法訪問該方法,因爲它被另一個線程使用。 –

+0

@AndreaFerrando這是你的第一個問題的單獨問題 - 如果你正在訪問UI控件,你需要在創建的線程上這麼做 - 這是UI線程。關於該主題的大量關於SO的信息只是搜索。 – khargoosh

+0

@Andrea Ferrando我更新了答案,並返回了任務和參數類 –