2013-10-05 31 views
2

我需要在以下情況的一些建議。我們有兩個API可以說API1和API2。 API1從API2調用一個方法。有時API1無法聯繫API2。但如果無法聯繫API2,則API1會嘗試三次。三次後,仍然如果API1無法聯繫API2,我們決定增加1分鐘的延遲時間,然後重試。 API1不應該依賴這1分鐘的延遲處理結果。它應該向用戶返回一個響應,例如「請檢查電子郵件的結果」。爲此,我們試圖如何實現第三方物流運行1分鐘後延遲的過程?

TPL(任務並行庫

在使用第三方物流的API1等待完成任務,然後只返回結果。

線程

我們試圖線程池,但它是老式的。

的.NET Framework 4.0

這裏API1的代碼實現TPL

public string TestTPL() 
    { 
     string str = string.Empty; 
     int i = 1; 
     ServiceReference1.Service1Client obj = new ServiceReference1.Service1Client(); 
     while (i <= 3) 
     { 
      //call a method resides in API2 
      string str = obj.API2Method(); 
      if (string.IsNullOrEmpty(str)) 
       i++; 
      else 
       break; 
     } 
     if (string.IsNullOrEmpty(str)) 
      Parallel.Invoke(() => DoSomeWork()); 
     return "Hey, I came"; 
    } 

    public void DoSomeWork() 
    { 
     //wait for 1 min 
     System.Threading.Thread.Sleep(60000); 
     ServiceReference1.Service1Client obj = new ServiceReference1.Service1Client(); 
     //call a method resides in API2 
     string str = obj.API2Method(); 
     //send mail to the user 

    } 
+0

請出示你已經嘗試了什麼,並註明C#和哪個版本的.NET 4.5你使用。 –

+1

那麼有什麼不工作,爲什麼?順便說一句,你使用Parallel.Invoke是沒有意義的。爲什麼? – usr

+0

只因爲舊事並不意味着它必須是壞的。根據你的具體情況使用最好的東西,不要看它的年齡。 – svick

回答

2

要運行子任務獨立父方法的,我們可以使用Task類。

public string TestTPL() //parent method 
    { 
     Task task = new Task(DoSomeWork); //child task 
     task.Start(); 
     return "Hey, I came"; 
    } 

任務可以獲得他們自己的專用線程並且不消耗來自池的線程。 在Parallel.Invoke的情況下,父類的方法等待,直到子任務拿完。

+0

如果DoSomeWork()引發異常,該怎麼辦? (爲什麼你有一個沒有使用的局部變量?) – svick

0

Parallel.Invoke()是一個同步調用,這意味着它不會返回,直到所有的孩子都是完整的。在這種情況下,它會一直等到DoSomWork()完成。

而不是

if (string.IsNullOrEmpty(str)) 
      Parallel.Invoke(() => DoSomeWork()); 

試着這麼做

if (string.IsNullOrEmpty(str)) 
      Task.Run(() => DoSomeWork()); 

那會在一個線程立即返回,並執行DoSomeWork()的線程池。

線程池是舊的,但它仍然是一個很好的工具。該TPL只是給你一些更好的語義來表達在更高層次上正在做什麼工作,而不是它是如何被蓋下完成的。

0
Task.Wait(60000).Run(() => { 

});