3

I am creating a webrequest both from the UI thread and a BackgroundWorker thread.

IAsyncResult result = request.BeginGetResponse (o => {
    callCallback (o);
}, state);

....

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

When I call this code from the UI thread it works fine. When called from the BackgroundWorker thread it freezes on BeginGetResponse.

The UI is still responsive. Any thoughts?

Edit: I figured out that I actually not need the UI context when calling from my background thread. And I think it would've been really hard injecting a ui context that always is valid. Here is my code now that works:

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 に答える