C# 从后台工作人员开始响应
我正在从UI线程和C# 从后台工作人员开始响应,c#,multithreading,mono,webrequest,C#,Multithreading,Mono,Webrequest,我正在从UI线程和BackgroundWorker线程创建webrequest IAsyncResult result = request.BeginGetResponse (o => { callCallback (o); }, state); 当我从UI线程调用此代码时,它工作正常。从BackgroundWorker线程调用时,它会在开始响应时冻结 用户界面仍然响应良好。有什么想法吗 编辑:我发现从后台线程调用时实际上不需要UI上下文。我认为注入一个总是有效的ui上下文是非
BackgroundWorker
线程创建webrequest
IAsyncResult result = request.BeginGetResponse (o => {
callCallback (o);
}, state);
当我从UI线程调用此代码时,它工作正常。从BackgroundWorker
线程调用时,它会在开始响应时冻结
用户界面仍然响应良好。有什么想法吗
编辑:我发现从后台线程调用时实际上不需要UI上下文。我认为注入一个总是有效的ui上下文是非常困难的。下面是我现在可以使用的代码:
private void callCallback (IAsyncResult o)
{
RequestStateGen state = (RequestStateGen)o.AsyncState;
if (!state.OnBgThread)
{
state.context.Post (_ => {
onGetCustomListObject (o);
}, null);
}
else
{
onGetCustomListObject (o);
}
}
}
您的代码依赖于同步上下文。当前捕获UI上下文。如果您已经在后台线程中,那么该上下文将不是UI的上下文
您可以从后台线程调用
BeginGetResponse
,但您需要确保SynchronizationContext.Current
是从UI线程调用的,并以某种方式暴露给您的后台线程。我发现从BackgroundWorker调用时,我的回调不需要UI上下文。注入UI上下文也非常困难。但和以前一样的问题。即使我删除了UI上下文,当从BackgroundWorker调用时,它也会冻结在BeginGetResponse上。请参阅我的更新答案。问题已解决。我没有正确设置OnBgThread变量。@Sunkas听上去不错;根据你的表现,我不确定你的变化会有什么问题。
private void callCallback (IAsyncResult o)
{
RequestStateGen state = (RequestStateGen)o.AsyncState;
if (!state.OnBgThread)
{
state.context.Post (_ => {
onGetCustomListObject (o);
}, null);
}
else
{
onGetCustomListObject (o);
}
}
}