如何报告某类方法的进度

时间:2019-04-08 12:12:37

标签: c#

如何报告类中方法的实时进度?

public class Foo{
    public string Bar(){
        int i = 0;
        while(true)
        {
            i++;
            //return i.ToString();
            if(i > 10) break;
        }
        return "Loop end";
    }
}


Foo foo = new Foo();

public void ShowStatus()
{
    string status = foo.Bar();
    //change the string value to each while loop
}

在这种情况下,预期的输出将是将字符串更新为每个循环而无需结束该方法。

2 个答案:

答案 0 :(得分:3)

您可以重构您的方法以使其异步运行并将一个IProgress对象传递给它:

public async Task ShowStatusAsync(IProgress<StatusProgress> progress)
{
  ...
  progress?.Report(new StatusProgress(...));
}

以下是有关该模式的更多信息: https://docs.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/task-based-asynchronous-pattern-tap

答案 1 :(得分:1)

您可以在Foo类中添加一个事件:

public delegate void ProgressEventHandler(object sender, ProgressEventArgs e);
public event ProgressEventHandler Progress;

...然后从您的其他班级订阅此活动:

Foo foo = new Foo();
foo.Progress += (sender, e) => { /* Do something */ };

...但是您需要编写许多代码,包括类ProgressEventArgs,并按照@Stefan的建议与Progress通用类进行异步可能更容易。