C# 如何将 T 的 Action 转换为 T 的 Task 的可等待函数

C# How to turn an Action of T into awaitable Function of Task of T

我希望能够将一些方法保存为操作及其对应的异步方法。为此,我需要将它们变成 Func<Task>.

我已经开始工作了。

public class Class1 {
    Action myAction;
    Func<Task> myFunc;

    public Class1() {
        // for demo purposes I use a local method
        void MyVoidMethod() {
            // some code
        }
        myAction = MyVoidMethod;
        myFunc = () => Task.Factory.StartNew(myAction);
    }

    public async void AnotherMethod() {
        // later in async some method
        await myFunc.Invoke();
    }
}

但是当我还想有一个可选的输入参数时,我该如何声明它,例如在异步函数中报告进度?我不明白语法是如何工作的。

public class Class2 {
    Action<IProgress<bool>> myAction;
    Func<Task<IProgress<bool>>> myFunc;

    public Class2() {
        void MyVoidMethod(IProgress<bool> prog = null) {
            // some code
        }
        myAction = MyVoidMethod;
        // line below gives squiggelies under `myAction`
        myFunc = () => Task.Factory.StartNew(myAction);
    }

    public async void AnotherMethod() {
        // later in async some method
        var prog = new Progress<bool>();
        prog.ProgressChanged += (s, e) => {
            // do something with e
        };
        await myFunc.Invoke(prog);
    }
}

您正在定义 myFunc 来接收任务而不是 returning 任务,您需要定义函数来接收 IProgress 和 return 作为结果的任务。

Func<IProgress<bool>, Task> myFunc;

然后你需要将进度传递给你的lambda中的执行方法

this.myFunc = p => Task.Factory.StartNew(() => this.MyVoidMethod(p))

而你的AnotherMethod需要将Progress in作为参数

public async void AnotherMethod(IProgress<bool> progress)
{
    await this.myFunc.Invoke(progress);
}