1

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

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

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

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

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

4

2 回答 2

0

仅供参考,这是我解决问题的方法。解决方案简单且无模式。如果我从头开始,我可能会按照@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);  
    }     
}
于 2013-06-20T17:06:18.353 回答
0

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

于 2013-06-19T22:05:21.610 回答