過去我聽到很多關於如何使用線程和任務進行編程對於天真非常危險的問題。那麼,我很天真,但我必須學習一段時間。我正在製作一個程序(實際上,它是一個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似乎對每個實例都保持不變,這正是我想要的......但我想確保我沒有做一些真正愚蠢的事情,會讓我在滿負荷的情況下陷入困境。
我我之前提供的鏈接中的原始代碼,顯示了兩種方法(我使用的方法以及Factory.StartNew方法)。我嘗試了他們兩個。我認爲我保留了Factory.StartNew方法,但顯然我撤消了太多的步驟。我一定會使用StartNew版本。感謝你的幫助,布蘭登。 – 2011-04-14 14:04:45
沒問題,祝你好運。 – BrandonZeider 2011-04-14 14:19:24
那麼這是否解決了您的問題? – BrandonZeider 2011-04-14 16:19:47