igu*_*man 2 .net c# asynchronous task-parallel-library async-await
我有一个异步函数(不返回实际值,仅返回Task对象),我需要在类构造函数中以及Threading.Timers.Timer触发时运行。
我无法将构造函数子标记为异步,并且当我使用AddressOf设置计时器回调时,它警告我“将从该异步函数返回的任务将被删除,并且其中的任何异常都将被忽略。请考虑将其更改为异步子,以便将其更改为异步子”。传播异常。”。我听说使用异步subs / voids不是一个好主意,应尽可能避免使用。
构造代码
Public Sub New(File As String)
Me.New()
Await ImportXml(File)
End Sub
Run Code Online (Sandbox Code Playgroud)
计时器代码
Private WithEvents SaveTimer As New Threading.Timer(AddressOf Save, Nothing, 30 * 1000, Threading.Timeout.Infinite)
Run Code Online (Sandbox Code Playgroud)
我认为使用构造函数可以将文件的加载分为单独的子项(除非有更好的方法),但不确定如何处理计时器。我想知道我做错了什么吗,有什么办法可以安排任务,某种Task Timer?
由于构造函数不能返回的任务,你可以代替有型隐藏它的构造函数和一个或多个暴露工厂方法是 asynchronus,做回任务,该类型的用户可以使用它来创建实例:
public class Foo
{
private Foo()
{
}
public static async Task<Foo> CreateAsync()
{
Foo foo = new Foo();
await foo.InitializeAsync();
return foo;
}
}
Run Code Online (Sandbox Code Playgroud)
至于计时器,您可以简单地避免使用实际的计时器,而只需创建一个async方法:
public static async Task DoStuff()
{
while (true)
{
await Task.Run(() => SomeWork());
await Task.Delay(TimeSpan.FromSeconds(30));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1996 次 |
| 最近记录: |