C#如何将T的动作转换为T的任务的等待函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#如何将T的动作转换为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();
    }
}

但是,当我还想要一个可选的输入参数来报告async Func的进度时,如何声明这个?我不明白语法是如何工作的。

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以接受Task而不是返回一个,您需要定义func以接收IProgress并返回Task作为结果。

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

以上是关于C#如何将T的动作转换为T的任务的等待函数的主要内容,如果未能解决你的问题,请参考以下文章

试图概括 c# 函数但得到“无法将'int'转换为'T'”

如何将DataTable转换成List<T>

如何将 nvarchar 从 T-SQL 方言转换为 hiveQL?

如何将字节数组转换为 boost::multiprecision::uint128_t?

将 char 数组转换为 uint16_t 数组 C/C++

如何跨操作系统一致地将 C uint64_t 转换为 Cgo?