2011-12-11 4 views
1

UI 스레드가 더 이상 차단되지 않을 때 다음 코드가 5 초 후에 WebRequests를 실행하는 이유는 무엇입니까? Thread.Sleep은 UI Thread에 속하며, WebRequests의 인스턴스화와 호출은 ThreadPool의 Thread 내에서 발생합니다. UI 스레드가 차단되는 동안 나는 백그라운드 스레드에서 WebRequest 클래스를 실행하기 위해 작성해야 어떤 코드UI 스레드가 차단 된 동안 백그라운드 스레드에서 WebRequest 실행

Loaded += (sender, args) => { 

    for (int i = 0; i < 5; i++) { 

     ThreadPool.QueueUserWorkItem(state => { 
      var request = WebRequest.CreateHttp("http://google.com"); 
      request.BeginGetResponse(ar => Debug.WriteLine("Request finished"), null); 
     }); 

     Thread.Sleep(1000); 
    } 

}; 

?

편집 : ... 자세히 말하자면. 이 요청은 백그라운드 스레드 이후 10 초 후에 실행되는 이유는 무엇입니까?

Loaded += (sender, args) => { 

    ThreadPool.QueueUserWorkItem(state => { 
     var request = WebRequest.CreateHttp("http://google.com"); 
     request.BeginGetResponse(ar => Debug.WriteLine("Request finished"), null); 
    }); 
    Thread.Sleep(10000); 

}; 

답변

1

: 이 DownloadStringAsync requires UI thread?

대답은 모든 네트워크 코드가 궁극적으로된다 Silverlight 5 이전 버전의 UI 스레드에 마샬링되었습니다. 불행히도 Silverlight 5를 빌드 할 때도 여전히 동일한 문제가 발생하므로 조사 중입니다 ...

0

은 아마 당신은 대신이 일을 의미 :

Loaded += (sender, args) => 
{ 
    ThreadPool.QueueUserWorkItem(dummy => 
    { 
     for (int i = 0; i < 5; i++) 
     { 

      ThreadPool.QueueUserWorkItem(state => 
      { 
       var request = WebRequest.CreateHttp("http://google.com"); 
       request.BeginGetResponse(ar => Debug.WriteLine("Request finished"), null); 
      }); 

      Thread.Sleep(1000); 
     } 
    }); 

}; 

이 전혀 UI를 차단하지 않습니다 및 디버그 메시지가 매초마다오고있다. 또는 원하는 행동은 무엇입니까? UI를 정말로 차단하고 싶습니까 (그렇게해서는 안됩니다 ...)? (편집 한 후)

편집 : 내가 볼

. 그것은 반 직관적 인 일이며 곧 답변을 얻을 수 없습니다. 요청에 일부 UI 스레드 활동이 필요하다고 생각됩니다. 주 스레드는 항상 응답 성이 있어야하며 결코 차단해서는 안됩니다. 그러면 문제가되지 않습니다. 메인 스레드를 차단하지 않는 한. 그래서 그들은 결함이있는 경우를 최적화하기위한 작업을 스스로 할 수 없었을 것입니다 (이것은).

그럼에도 불구하고 대답은 흥미로울 것입니다. 데스크탑 관련 세계에서 브라우저 관련 자료에는 메인 스레드가 필요하다는 것을 압니다. 그래서 나는 더 이상 차단하지 않는 것이 좋습니다 :) 나는 (내가 당신을 발견 지금은 폐쇄 것있는) 여기에 거의 똑같은 질문을

+0

고맙습니다. 나는 당신의 해결책이 효과가 있다는 것을 알고 있지만 그것은 내가 찾고있는 것이 아닙니다. 내 편집 된 질문을 참조하십시오. – djsolid

관련 문제