在 C# 的构造函数中启动异步方法

Kick off async method in constructor in c#

我想知道按以下方式在构造函数中调用异步方法是否安全:

假设我们有一个异步方法 Refresh 从 Internet 获取数据。我们还使用 Reactive Extensions 通知所有感兴趣的人已获取新数据。

我想知道在 class 构造函数中第一次调用 Refresh 是否安全?我可以使用这样的结构吗?

Task.Run(Refresh);

Refresh().ConfigureAwait(false)

我对这个方法是否完成并不感兴趣,因为在获取数据时我会通过 Reactive Extensions 收到通知。

这样可以吗?

public class MyClass
{
    BehvaiorSubject<Data> _dataObservable = new BehvaiorSubject(Data.Default);
    IObservable DataObservable => _dataObservable;

    public MyClass()
    {
        Refresh().ConfigureAwait(false);     
    }

    public async Task Refresh()
    {
        try
        {
           var data = await FetchDataFromNetwork();

           _dataObservable.OnNext(data);

        }
        catch (VariousExceptions e)
        {
           //do some appropriate stuff
        }
        catch(Exception)
        {
           //do some appropriate stuff
        }
    }
}

虽然有人反对这个想法,但我们的项目中有类似的东西:)

问题是您必须正确处理从 Task 抛出的任何异常,以防它们未被观察到。此外,您可能需要通过方法或 属性 公开任务,以便可以 await(必要时)完成异步部分。

class MyClass
{
    public MyClass()
    {
        InitTask = Task.Delay(3000);

        // Handle task exception.
        InitTask.ContinueWith(task => task.Exception, TaskContinuationOptions.OnlyOnFaulted);
    }

    public Task InitTask { get; }
}