我如何在类构造函数/计时器回调中等待任务

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?

Ser*_*rvy 5

由于构造函数不能返回的任务,你可以代替有型隐藏它的构造函数和一个或多个暴露工厂方法 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)