3

我有一个执行很长任务的函数,我想偶尔通过状态更新来更新其他地方的变量。(如果有更好的方法可以做到这一点,那也很好)我正在编写一个库,并且可能会一次调用该代码多次,因此在存储该变量的同一个类中创建另一个变量不是一个选项。这是我的代码可能的样子:

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());
    }
}
4

4 回答 4

4

这不是向呼叫者提供更新的好方法。

最好在类库中定义一个或多个事件(如OnErrorOnProgress等)。例如,OnProgress当您想通知某个操作的进度时,您可以提出:

for (int i = 0; i < CountToWhat; i++) {
  OnProgress(CountToWhat / i);
  Console.WriteLine(i.ToString());
}

这是一种更好的方法,尤其是在从工作线程通知时。

于 2012-07-06T15:09:20.433 回答
3

将签名更改为:

public static bool Count(ref int Progress, int CountToWhat)

当你调用它时,在你作为第一个参数传入的变量之前使用 ref 关键字。

于 2012-07-06T15:07:25.457 回答
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)
{
  ....
}
于 2012-07-06T15:06:52.527 回答
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事件。

于 2012-07-06T15:13:35.100 回答