我正在从UI线程和BackgroundWorker
线程创建webrequest。
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语境真的很难。这是我现在的代码:
private void callCallback (IAsyncResult o)
{
RequestStateGen state = (RequestStateGen)o.AsyncState;
if (!state.OnBgThread)
{
state.context.Post (_ => {
onGetCustomListObject (o);
}, null);
}
else
{
onGetCustomListObject (o);
}
}
}
答案 0 :(得分:1)
您的代码依赖于SynchronizationContext.Current
抓取UI上下文。如果您已经在后台线程中,那么该上下文将不是UI的上下文。
您可以从后台线程中调用BeginGetResponse
,但是您需要确保从UI线程调用SynchronizationContext.Current
并以某种方式暴露给您的后台线程。