Запустите метод asyn c в конструкторе в c# - PullRequest
0 голосов
/ 18 марта 2020

Мне интересно, безопасно ли вызывать метод asyn c в конструкторе следующим образом:

Допустим, у нас есть метод asyn c Refre sh который извлекает данные из inte rnet. Мы также используем Reactive Extensions , чтобы уведомить всех, кто заинтересован в получении новых данных.

Мне интересно, безопасно ли вызывать Refre sh впервые в конструкторе класса? Могу ли я использовать такую ​​конструкцию?

Task.Run (Refre sh);

или

Refre sh () .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
        }
    }
}

1 Ответ

1 голос
/ 18 марта 2020

Хотя люди против этой идеи, у нас есть похожие вещи в нашем проекте:)

Дело в том, что вы должны правильно обрабатывать любые исключения, выбрасываемые из этого Task, в случае, если они go незамечены. Также вам может понадобиться открыть задачу с помощью метода или свойства, просто чтобы await (при необходимости) асин c часть была закончена.

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

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

    public Task InitTask { get; }
}
...