我正在从 UI 线程和 BackgroundWorker
线程创建一个网络请求。
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 上下文。而且我认为注入(inject)始终有效的 ui 上下文真的很难。这是我现在可以使用的代码:
private void callCallback (IAsyncResult o)
{
RequestStateGen state = (RequestStateGen)o.AsyncState;
if (!state.OnBgThread)
{
state.context.Post (_ => {
onGetCustomListObject (o);
}, null);
}
else
{
onGetCustomListObject (o);
}
}
}
最佳答案
您的代码依赖于 SynchronizationContext.Current
获取 UI 上下文。如果您已经在后台线程中,那么该上下文将不是 UI 的上下文。
您可以从后台线程调用 BeginGetResponse
就好了,但是您需要确保从 UI 线程调用 SynchronizationContext.Current
并以某种方式暴露给您的后台线程.
关于c# - 从 BackgroundWorker 开始获取响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15251997/