2011-04-13 3 views
1

과거에는 스레드와 작업으로 프로그래밍하는 것이 순진한 사람에게 매우 위험하다는 이야기를 많이 들었습니다. 글쎄, 나는 순진하지만 언젠가는 배워야 해. 제 3 자에게 전화해서 응답을 기다려야하는 프로그램 (실제로는 ASP.Net의 Generic Handler입니다)을 만들고 있습니다. 기다리는 동안 처리기가 다른 작업을 계속하도록하고 싶습니다. 따라서 제 3 자 웹 요청을 비동기 적으로 수행하는 방법을 알아 내려고하고 있습니다. 내가받은 몇 가지 다른 질문에 대한 답변을 기반으로, 여기에 나와있는 것이 있지만, 처리기가 여러 번 동시에 호출 될 때 큰 문제가 발생하지 않도록하고 싶습니다.작업을 이산 적으로 유지하기

이 테스트하려면 콘솔 프로젝트를 빌드해야합니다.

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(); 
    } 
} 

I는 별도의 개체 (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를 유지했다는 것을 생각했다 .Start 새로운 방법, 그러나 분명히 나는 ​​1 단계를 너무 많이 실행 취소했다. 나는 확실히 StartNew 버전을 사용할 것이다. 도움을 주셔서 감사합니다, Brandon. –

+0

문제 없습니다, 행운을 비네. – BrandonZeider

+0

이렇게하면 문제가 해결 되었습니까? – BrandonZeider