如何钩入当前正在运行的后台线程以获取其结果?
本文关键字:线程 获取 结果 后台 何钩入 运行 | 更新日期: 2023-09-27 18:19:19
如果有一个后台线程在运行一个操作,我希望UI线程等到它结束,然后得到结果。
更多细节。当我打开一个对话框,用户感兴趣的2条信息——我们称之为Info1
和Info2
。Info1
需要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);
}
}