2011-04-13 107 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