在 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; }
}
我想知道按以下方式在构造函数中调用异步方法是否安全:
假设我们有一个异步方法 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; }
}