3

我正在从 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 上下文。而且我认为注入一个始终有效的 ui 上下文真的很难。这是我现在可以使用的代码:

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

1 回答 1

1

您的代码依赖于SynchronizationContext.Current抓取 UI 上下文。如果您已经在后台线程中,那么该上下文将不是 UI 的上下文。

您可以BeginGetResponse从后台线程调用就好了,但您需要确保SynchronizationContext.Current从 UI 线程调用它并以某种方式暴露给您的后台线程。

于 2013-03-06T15:58:14.223 回答