【发布时间】:2021-01-06 11:36:51
【问题描述】:
我是一名大学生,但由于我喜欢编程,因此我尝试创建一个对我有用的代码库(类似于代码库)。
在此过程中,我开始设计/编写一个异步方法,该方法将用于联锁变量。我的目标是在等待此方法(同步运行)和未等待时产生不同的结果。
一个例子如下:
private int _lock;
public async Task<bool> Lock()
{
if (method_is_not_being_awaited)
return Interlocked.Exchange(ref _lock, 1) == 0;
while (0 != Interlocked.Exchange(ref _lock, 1)) {}
return true;
}
有什么办法可以达到这样的效果吗?如果是,怎么做?
ps:我知道我可以制作两种不同的方法 bool lock() 和 async Task<bool> lockAsync() 但是,这不是我要求的
【问题讨论】:
-
听起来你错过了等待如何工作的概念。 await 不会导致方法同步运行,它会导致调用方法的其余部分被链接到返回的任务上。这是一个完全不同的概念。
-
另外,您希望该方法如何将返回的任务分配给一个变量,然后等待该变量?
-
是的,我完全明白你想说什么。我“试图做的”肯定不是异步函数的预期用例。只是我试图重新利用它的功能。对于某些人来说,将相同的方法用于两件不同的事情会令人困惑,但对我来说效果很好。所以,出于好奇和兴趣,我决定问问^_^
-
请注意,正如@user1937198 所暗示的,即使您可以分析代码:
var lockTask=Lock(); if (userInput==true) await lockTaskl;,也无法知道方法调用的结果是否曾经被等待。这接近termination/halting problems CS 课程可能涵盖 0 考虑采取一... -
这也是正确的,但是使用
async void而不是async Task方法会如何解决这个问题?
标签: c# .net .net-core async-await