我有一个执行长任务的函数,我想偶尔使用状态更新来更新其他地方的变量。 (如果有更好的方法可以做到这一点,那也没关系)我正在编写一个库,这个代码可能会被多次调用,因此在同一个类中创建另一个存储变量的变量不是一个选项。这是我的代码可能是什么样的:
public static bool Count(int Progress, int CountToWhat) {
for (int i = 0; i < CountToWhat; i++) {
Progress = CountToWhat / i; // This is how I'd like to update the value, but obviously this is wrong
Console.WriteLine(i.ToString());
}
}
答案 0 :(得分:4)
这不是向来电者提供更新的好方法。
最好在类库中定义一个或多个事件(例如OnError
,OnProgress
等)。
例如,当您想要在某个操作中通知进度时,可以引发OnProgress
:
for (int i = 0; i < CountToWhat; i++) {
OnProgress(CountToWhat / i);
Console.WriteLine(i.ToString());
}
这是一种更好的方法,特别是在从工作线程通知时。
答案 1 :(得分:3)
将签名更改为:
public static bool Count(ref int Progress, int CountToWhat)
当你调用它时,在传入的变量之前使用ref关键字作为第一个参数。
答案 2 :(得分:2)
您可以使用
int Progress = 0;
public static bool Count(ref int Progress, int CountToWhat)
{
....
}
或
int Progress; //without init
public static bool Count(out int Progress, int CountToWhat)
{
....
}
答案 3 :(得分:1)
更好的方法可能是通过Action<int>
委托来调用报告进度:
public static bool Count(int CountToWhat, Action<int> reportProgress)
{
for (int i = 0; i < CountToWhat; i++)
{
var progress = CountToWhat / i;
reportProgress(progress);
Console.WriteLine(i.ToString());
}
}
那你就像使用它一样:
Count(100, p => currentProgress = p);
您还可以使用BackgroundWorker类来运行长时间运行的任务,并利用其ProgressChanged事件。