2013-03-06 52 views
3

我正在從UI線程和BackgroundWorker線程創建webrequest。來自BackgroundWorker的BeginGetResponse

IAsyncResult result = request.BeginGetResponse (o => { 
    callCallback (o); 
}, state); 

....

private void callCallback (IAsyncResult o) 
{ 
    RequestStateGen state = (RequestStateGen)o.AsyncState; 
    state.context.Post (_ => { 
     onGetCustomListObject (o); 
    }, null); 
} 

當我打電話從UI該代碼線程它工作正常。當從BackgroundWorker線程調用時,它會在BeginGetResponse上凍結。

UI仍然響應。有什麼想法嗎?

編輯:我想我從後臺線程調用時實際上不需要UI上下文。而且我認爲注入一個總是有效的ui上下文會非常困難。這是我現在的代碼:

private void callCallback (IAsyncResult o) 
{ 
    RequestStateGen state = (RequestStateGen)o.AsyncState; 
    if (!state.OnBgThread) 
     { 
      state.context.Post (_ => { 
       onGetCustomListObject (o); 
      }, null); 
     } 
     else 
     { 
      onGetCustomListObject (o); 
     } 
    } 
} 

回答

1

您的代碼依賴於SynchronizationContext.Current來獲取UI上下文。如果您已經在後臺線程中,那麼該上下文將不會是UI的上下文。

你可以從後臺線程調用BeginGetResponse就好了,但你需要確保從UI線程調用SynchronizationContext.Current並以某種方式暴露給後臺線程。

+0

我發現從BackgroundWorker調用時,我不需要用於回調的UI上下文。注入UI上下文也很困難。但是和以前一樣的問題。即使我刪除UI上下文,也會在從BackgroundWorker調用BeginGetResponse時凍結。看到我更新的答案。 – Sunkas 2013-03-07 09:43:24

+0

問題解決。我沒有正確設置OnBgThread變量。 – Sunkas 2013-03-08 08:52:18

+0

@Sunkas好聽,我不確定你所做的改變可能會出現什麼問題。 – Servy 2013-03-08 14:21:15