问题描述
- c# 如何等待一个返回值为void的进度报告事件结束?
- 需求:progress.Report执行进度报告完成后,再执行其余的代码;
问题:progress.Report的返回值是void,没法用await,怎么等待其结束?
解决方案
答案出来了:
var task = Task<int>.Run(() => { int i = UpdateResult(dictionaryStockReal[stockCode]); return i; }); //报告一次进度后退出if(task.Result ==1)
其中: UpdateResult就是progress.Report调用的函数。
总结:灵活运行Task,可以完全抛弃MS程式化的IProgress.Report 方法!
解决方案二:
progress是什么类型?不是系统类库的吧。要看你的代码。
解决方案三:
Progress 构造函数 (Action)
我现在的代码是这样的:
//重置IsUpdated标志 dictionaryStockReal[stockCode].IsUpdated = false;progress.Report(dictionaryStockReal[stockCode]);//确认进度报告已完成,否则死循环---需要找到更好的办法!while (!dictionaryStockReal[stockCode].IsUpdated){ }//后面的代码省略,必须确认进度报告任务已完成,否则后面的操作与进行中的进度报告有冲突。
解决方案四:
Progress 构造函数 (Action)
https://msdn.microsoft.com/zh-cn/library/hh160061(v=vs.110).aspx
解决方案五:
在进度报告调用的事件结尾,设置dictionaryStockReal[stockCode].IsUpdated =true;//dictionaryStockReal为窗体级字典
解决方案六:
Response.End();
解决方案七:
Dispose()方法,虽然能释放当前窗体的资源,却不能强制结束循环,
要想强制突出当前程序要用:System.Environment.Exit(int exitcode)方法;该方法:终止当前进程并为基础操作系统提供指定的退出代码。
如下则问题解决:
private void frmFileDisposal_Closed(object sender System.EventArgs e)
{
System.Environment.Exit(System.Environment.ExitCode);
this.Dispose();
this.Close();
}
解决方案八:
不知能否把进度报告要执行的事件定义为一个task,然后在启动进度报告后,执行task.wait();自己测试下先。。。
解决方案九:
编程是一种美德,是促使一个人不断向上发展的一种原动力。