2011-04-13 50 views
1

過去我聽到很多關於如何使用線程和任務進行編程對於天真非常危險的問題。那麼,我很天真,但我必須學習一段時間。我正在製作一個程序(實際上,它是一個ASP.Net的通用處理程序),需要致電第三方並等待響應。在等待的時候,我想讓處理程序繼續做其他的事情,所以我想弄清楚如何異步執行第三方Web請求。基於我收到的其他一些問題的一些答案,這裏是我想到的,但是我想確保當我的處理程序被多次同時調用時,我不會遇到大問題。在任務中保留內存離散

爲了測試這個,我構建了一個控制檯項目。

class Program 
{ 
    static void Main(string[] args) 
    { 
     RunRequestAsynch test = new RunRequestAsynch(); 
     test.TestingThreadSafety = Guid.NewGuid().ToString(); 

     Console.WriteLine("Started:" + test.TestingThreadSafety); 

     Task tTest = new Task(test.RunWebRequest); 
     tTest.Start(); 

     while (test.Done== false) 
     { 
      Console.WriteLine("Still waiting..."); 
      Thread.Sleep(100); 
     } 

     Console.WriteLine("Done. " + test.sResponse); 

     Console.ReadKey(); 
    } 
} 

我實例化一個單獨的對象(RunRequestAsynch)在其上設置一些值,然後啓動它。雖然這是處理,我只是輸出一個字符串到控制檯窗口。

public class RunRequestAsynch 
{ 
    public bool Done = false; 
    public string sResponse = ""; 
    public string sXMLToSend = ""; 

    public string TestingThreadSafety = ""; 

    public RunRequestAsynch() { } 


    public void RunWebRequest() 
    { 
     Thread.Sleep(500); 
     // HttpWebRequest stuff goes here 
     sResponse = TestingThreadSafety; 
     Done = true; 
     Thread.Sleep(500); 

    } 
} 

所以......如果我的這些運行1000同時,我就可以在每個實例有自己的內存和性能,對事實算?並且該行「完成=真實」不會觸發,然後Generic Handler的每個實例都會死亡,對吧?

我寫了一個.bat文件來運行多個實例,並且我爲每個特定對象設置的guid似乎對每個實例都保持不變,這正是我想要的......但我想確保我沒有做一些真正愚蠢的事情,會讓我在滿負荷的情況下陷入困境。

回答

1

我沒有看到任何明顯的問題,但是您應該使用consider using the Factory.StartNew instead of Start。每個任務只能執行一次,所以同時運行多個任務沒有任何問題。

如果你想簡化你的代碼一點,並採取Factory.StartNew的優勢,在你的處理器,你可以做這樣的事情(從我記得你的最後一個問題):

Task<byte[]> task = Task.Factory.StartNew<byte[]>(() => // Begin task 
{ 
    //Replace with your web request, I guessed that it's downloading data 
    //change this to whatever makes sense 
    using (var wc = new System.Net.WebClient()) 
     return wc.DownloadData("Some Address"); 
}); 

//call method to parse xml, will run in parallel 

byte[] result = task.Result; // Wait for task to finish and fetch result. 
+0

我我之前提供的鏈接中的原始代碼,顯示了兩種方法(我使用的方法以及Factory.StartNew方法)。我嘗試了他們兩個。我認爲我保留了Factory.StartNew方法,但顯然我撤消了太多的步驟。我一定會使用StartNew版本。感謝你的幫助,布蘭登。 – 2011-04-14 14:04:45

+0

沒問題,祝你好運。 – BrandonZeider 2011-04-14 14:19:24

+0

那麼這是否解決了您的問題? – BrandonZeider 2011-04-14 16:19:47