C# 从后台工作人员开始响应

C# 从后台工作人员开始响应,c#,multithreading,mono,webrequest,C#,Multithreading,Mono,Webrequest,我正在从UI线程和BackgroundWorker线程创建webrequest IAsyncResult result = request.BeginGetResponse (o => { callCallback (o); }, state); 当我从UI线程调用此代码时,它工作正常。从BackgroundWorker线程调用时,它会在开始响应时冻结 用户界面仍然响应良好。有什么想法吗 编辑:我发现从后台线程调用时实际上不需要UI上下文。我认为注入一个总是有效的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);
        }
    }
}