有没有办法知道一个方法是否正在运行,正在等待方法内部的消息



我是一名大学生,但由于我喜欢编程,我尝试创建一个对我有用的代码库(类似于代码库(。

在这个过程中,我开始设计/编写一个异步方法,该方法将用于互锁变量。我的目标是在等待此方法(同步运行(和不等待时产生不同的结果。

例如:


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(执行任何操作之前,方法必须返回值。它并不特定于async方法,而是所有代码在C#(以及几乎任何其他语言(中的行为。

另一方面,很容易做一些非常接近您要求的事情——一旦尝试await,就同步返回值——方法的结果:await本质上只是对结果的GetAwaiter的调用,您可以将其连接起来以更改方法的状态。

请注意,若方法一直在等待,那个么您真的不知道该怎么办——所以虽然您可以在调用await时立即采取行动,但您真的无法提前知道是否应该启动异步处理。因此,您所能达到的最佳效果是在同步部分什么都不做,无论如何都要启动异步处理,并在调用await时立即返回结果(中止/忽略方法的异步部分(。

有关实现可作为结果使用的类的详细信息,请参阅https://www.codeproject.com/Articles/5274659/How-to-Use-the-Csharp-Await-Keyword-On-Anything和https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/task-asynchronous-programming-model.

下面的骨架代码显示了如何实现除非调用await否则什么都不做的方法:

class MyTask
{
public MyAwaitable GetAwaiter()
{
return new MyAwaitable();
}
}
class MyAwaitable : INotifyCompletion
{
public bool IsCompleted 
{  
get { return true; }
}

public int GetResult()
{
return 42; // this is our "result" from method.
}

public void OnCompleted (Action continuation)
{
// just run instantly - no need to save callback as this one is 
// always "completed"
continuation(); 
}
}
MyTask F()
{
// if your really want you can start async operation here
// and somehow wire up MyAwaitable.IsComplete to terminate/abandon
// asynchronous part.
return new MyTask();
}

最新更新