c# - 从 BackgroundWorker 开始获取响应

标签 c# multithreading mono webrequest

我正在从 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/

相关文章:

c# - 如何处理具有不同值类型的字典

c# - Entity Framework - 将组合框绑定(bind)到规范化表字段

c++ - C++11 中的线程 ID 行为

c# - .Net 框架开发人员在 Mono 中的局限性

c# - .Net Core 控制台应用程序 - 调试失败 - 与远程端点的连接已终止

c# - 扩展方法,泛型 List<T> 上的 SumIf

c# - 为什么即使使用 Monitor 时,并非所有成员变量都需要 volatile 以保证线程安全? (为什么这个模型真的有效?)

python - 初级Python线程问题

multithreading - 使用 "Parallel.For"时并非所有项目都在绘制

c# - 是否可以在由C#组成的Mono项目上连接Azure Sql数据库?