我想知道通过以下方式在构造函数中调用异步方法是否安全:
假设我们有一个异步方法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
}
}
}
尽管人们反对这个想法,但我们的项目中有类似的事情:)
问题是您必须正确处理从该Task
引发的所有异常,以防它们被忽略。另外,您可能需要通过方法或属性来公开任务,以使await
(必要时)可以完成异步部分。
class MyClass
{
public MyClass()
{
InitTask = Task.Delay(3000);
// Handle task exception.
InitTask.ContinueWith(task => task.Exception, TaskContinuationOptions.OnlyOnFaulted);
}
public Task InitTask { get; }
}