我有一个想要等待的方法,但我不想引起多米诺骨牌效应,认为任何东西都可以调用这个调用方法并等待它。例如我有这样的方法:
public bool Save(string data)
{
int rowsAffected = await UpdateDataAsync(data);
return rowsAffected > 0;
}
我打电话:
public Task<int> UpdateDataAsync()
{
return Task.Run(() =>
{
return Data.Update(); //return an integer of rowsAffected
}
}
这不起作用,因为我必须在方法签名中添加“async”Save()
然后我就回不去了bool
我必须做到Task<bool>
但我不想让任何人等待Save()
method.
有没有办法可以像await一样暂停代码执行,或者以某种方式在没有async修饰符的情况下等待此代码?
如何在此父方法中等待异步方法而不使用异步修饰符?
这有点像问“如何使用 C# 编写应用程序而不依赖于任何类型的 .NET 运行时?”
简短的回答:不要这样做。
实际上,您在这里所做的是采用自然同步方法(Update
),通过在线程池线程上运行它使其看起来异步(UpdateDataAsync
),然后您想要阻止它以使异步方法看起来同步(Save
)。严重的危险信号。
我建议您仔细研究 Stephen Toub 的两篇著名博客文章我应该为我的同步方法公开异步包装器吗 https://devblogs.microsoft.com/pfxteam/should-i-expose-asynchronous-wrappers-for-synchronous-methods/ and 我应该为我的异步方法公开同步包装器吗 https://devblogs.microsoft.com/pfxteam/should-i-expose-synchronous-wrappers-for-asynchronous-methods/。这两个问题的答案都是“否”,尽管 Stephen Toub 解释了几种在确实需要时可以这样做的选择。
“确实必须”应该保留给应用程序级别。我假设这些方法(Update
, UpdateDataAsync
, and Save
)位于应用程序的不同层(例如,数据/数据服务/视图模型)。数据/数据服务层不应进行同步/异步转换。视图模型(特定于应用程序的)级别是唯一有理由进行这种转换的级别——并且它应该只作为最后的手段这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)