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);
}
我希望能够将一些方法保存为操作及其对应的异步方法。为此,我需要将它们变成 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);
}