如何钩入当前正在运行的后台线程以获取其结果?

本文关键字:线程 获取 结果 后台 何钩入 运行 | 更新日期: 2023-09-27 18:19:19

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

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

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

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

我的问题是这样的。什么是一个很好的模式挂钩到后台线程将和获取其结果时,操作结束了?

如何钩入当前正在运行的后台线程以获取其结果?

如果你正在使用。net 4.5,看看async/await——它们是为你的场景设计的。

仅供参考,以下是我如何解决这个问题的。解决方案简单且无模式。如果我从头开始,我可能会像@agbinfo

建议的那样使用期货
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);  
    }     
}