【发布时间】:2015-04-10 09:19:41
【问题描述】:
应用
我有一个被多个项目引用的View Model 或Views。
由于 API,一些 View 项目是 async 而其他不是。
View 项目使用 IOC 容器将其接口实现注入View Model。
代码
考虑这个最小的代码示例
界面:
public interface IDatabase
{
Task<Data> GetData();
}
View Model 等待 GetData 方法:
public class DisplayDataViewModel
{
private readonly IDatabase _database
public DisplayDataViewModel(IDatabase database)
{
_database = database;
}
private async Task GetDataFromDatabase()
{
Data data = await _database.GetData();
// do something with data...
}
}
Asynchronous View 项目使用 Async 函数获取数据
public class AsynchronousViewDataBase : IDatabase
{
public async Task<Data> GetData()
{
return await GetDataAsync();
}
}
Synchronous View项目使用同步调用获取数据,但是由于接口的限制,我需要返回一个Task,但我只对Data的返回感兴趣,从而使方法异步.
public class SynchronousViewDatabase : IDatabase
{
public async Task<Data> GetData()
{
return GetData();
}
}
但是然后它给出警告:
此异步方法缺少“等待”运算符,将同步运行。考虑使用 'await' 运算符来等待非阻塞 API 调用,或使用 'await Task.Run(...)' 在后台线程上执行 CPU 密集型工作。
这对我来说还不错,因为我不在乎它是否同步运行。
使用Task.Run 来抑制警告似乎没有必要,因为调用可以(在我的情况下确实如此)来自后台线程。
问题
是否有实现这种非等待异步方法的最佳实践?可以忽略警告吗?有没有更好的方法来实现 async 同步调用?
附加
我确实将接口转换为同步调用,并在Asynchronous View 中使用了Task.Result(修复了警告),但这导致应用程序停止响应并且出现了很多难题。
注意:我不是说使用 async 关键字会神奇地使方法异步运行。
【问题讨论】:
标签: c# .net multithreading asynchronous async-await