【发布时间】:2018-09-17 11:18:05
【问题描述】:
我希望能够将一些方法保存为操作及其对应的异步对应项。为此,我需要将它们变成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);
}
}
【问题讨论】:
-
您可能会混淆
Action<T>,它将T作为输入参数,而Task<T>返回一个T 作为结果。除此之外,不要声明async void方法。始终使用async Task。
标签: c# async-await delegates func