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

问题描述 投票:0回答:1

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

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

我想知道在类构造函数中第一次调用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
        }
    }
}
c# xamarin reactivex
1个回答
2
投票

尽管人们反对这个想法,但我们的项目中有类似的事情:)

问题是您必须正确处理从该Task引发的所有异常,以防它们被忽略。另外,您可能需要通过方法或属性来公开任务,以使await(必要时)可以完成异步部分。

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

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

    public Task InitTask { get; }
}
© www.soinside.com 2019 - 2024. All rights reserved.