【问题标题】:How do I hook into a currently running background thread to fetch its result?如何挂钩到当前正在运行的后台线程以获取其结果?
【发布时间】:2013-06-19 22:01:35
【问题描述】:

如果有后台线程在运行一个操作,我希望 UI 线程等到它结束后再得到结果。

更多细节。当我打开一个对话框时,用户对两条信息感兴趣——我们称他们为Info1Info2Info1 需要 5 秒来检索,Info2 需要 15-30 秒来检索。为了不惹恼用户,我最初获取/显示Info1 并提供一个按钮来获取Info2

当我获取Info1 时,我会启动一个后台线程来获取Info2。希望当用户按下Info2 的按钮时,它已经被获取(并缓存在内存结构中)并且用户可以立即看到信息。

现实情况是,90% 的时间,用户在后台线程完成之前按下Info2 按钮。

我的问题是这样的。在操作结束时随意挂接到后台线程并获取其结果的好模式是什么?

【问题讨论】:

  • 作为一般模式,我会让工作线程在完成时发布其结果,因此根本不会“挂钩”到工作线程,而是发布到 UI 可以读取的数据结构按需,或向 UI 发出信号。这里有各种各样的选择。您可以使用对数据结构(一种“邮箱”)的同步访问,或者表示工作线程的类可以声明一个事件,UI 可以将处理程序附加到该事件,或者工作人员的“主”函数可以接受委托作为一个参数,它将调用以发出某些事件的信号。
  • 看起来像您的 IDE 中的缺陷。从正在努力获取它的线程中获取不完整结果的想法有点偏离图表。看看 BackgroundWorker 是如何通过 ProgressChanged 事件一一滴漏结果的。线程推,你不拉。
  • @HansPassant 上述功能是从 UI 中删除的几个库。

标签: c# multithreading winforms .net-4.0 thread-safety


【解决方案1】:

如果您使用的是 .Net 4.5,请查看 async/await - 它们专为您的场景而设计。

【讨论】:

    【解决方案2】:

    仅供参考,以下是我解决问题的方法。解决方案很简单且没有模式。如果我从头开始,我可能会按照@agbinfo 的建议使用 Futures

    private Thread thInfo2;
    
    public Result GetData(Request request) {
    
        if (request.DataType == eDataType.Info2) {
    
            // if the request for Info2 is in progress already, wait a bit.
            while (thInfo2 != null && thInfo2.IsAlive)
            {
                Debug.WriteLine("Waiting");
                Thread.Sleep(500);
            }
        }     
    
        // fire off the fetch
        Response response = svc.GetData(request)
    
        // kick off a secondary fetch if this request is for Info1
        if (request.DataType == eDataType.Info2) {
            thInfo2 = new Thread(FetchInfo2InBackground)
            {
                Priority = ThreadPriority.Lowest,
                IsBackground = true
            };
            thInfo2.Start(request);  
        }     
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      相关资源
      最近更新 更多