gpt4 book ai didi

c# - 如何在此父方法中等待没有异步修饰符的异步方法?

转载 作者:可可西里 更新时间:2023-11-01 08:42:33 26 4
gpt4 key购买 nike

我有一个我想要等待的方法,但我不想造成多米诺骨牌效应,认为任何东西都可以调用这个调用方法并等待它。比如我有这个方法:

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
}
}

这行不通,因为我必须在 Save() 的方法签名中加入“async”然后我不能返回 bool我必须做到Task<bool>但我不想让任何人等待 Save()方法。

有没有办法像 await 一样暂停代码执行,或者以某种方式在没有 async 修饰符的情况下等待这段代码?

最佳答案

How can I await an async method without an async modifier in this parent method?

这有点像问“我如何使用 C# 编写应用程序而不依赖于任何类型的 .NET 运行时?”

简短回答:不要那样做。

实际上,您在这里所做的是采用一种自然同步的方法 (Update),通过在线程池线程 (UpdateDataAsync) 上运行它使其看起来是异步的),然后您想要阻止它以使异步方法看起来是同步的 (Save)。严重的危险信号。

我建议您仔细研究 Stephen Toub 著名的两篇博文 should I expose asynchronous wrappers for my synchronous methodsshould I expose synchronous wrappers for my asynchronous methods .这两个问题的答案都是“否”,尽管 Stephen Toub 解释了几种选择,如果您真的必须这样做的话。

“真的必须”应该留给应用层。我假设这些方法(UpdateUpdateDataAsyncSave)位于应用程序的不同层(例如,数据/数据服务/ View 模型) ).数据/数据服务层不应进行同步/异步转换。 View 模型(特定于应用程序)级别是唯一有借口进行这种转换的级别——它应该只作为最后的手段这样做。

关于c# - 如何在此父方法中等待没有异步修饰符的异步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16877262/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com