C# 有没有办法知道是否有一个方法正在运行,并从该方法中等待?

C# 有没有办法知道是否有一个方法正在运行,并从该方法中等待?,c#,.net,.net-core,async-await,C#,.net,.net Core,Async Await,我是一名大学生,但由于我喜欢编程,我尝试创建一个对我有用的代码库(类似于代码库) 在此过程中,我开始设计/编写一个异步方法,该方法将用于联锁变量。我的目标是在等待此方法(同步运行)和不等待此方法时产生不同的结果 例如: 私人内部锁; 公共异步任务锁() { 如果(方法未被等待) 返回联锁。交换(参考锁定,1)==0; 而(0!=Interlocked.Exchange(ref _lock,1)){ 返回true; } 有没有办法达到这样的效果?如果是,如何进行 ps:我知道我可以制作两种不同

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

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

例如:


私人内部锁;
公共异步任务锁()
{
如果(方法未被等待)
返回联锁。交换(参考锁定,1)==0;
而(0!=Interlocked.Exchange(ref _lock,1)){
返回true;
}
有没有办法达到这样的效果?如果是,如何进行


ps:我知道我可以制作两种不同的方法
bool lock()
async Task lock async()
,但是,这不是我要求的

不,不可能实现您想要的,因为在对结果执行任何操作(包括
wait
)之前,方法必须返回值。它并不特定于
async
方法,而是所有代码在C#(以及几乎所有其他语言)中的行为

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

请注意,若方法一直在等待,那个么您真的不知道该怎么做—所以,尽管您可以在调用
await
时执行操作,但您确实无法提前知道是否应该启动异步处理。所以,您所能达到的最佳效果就是在同步部分不做任何事情,无论如何都要启动异步处理,并在调用
wait
时立即返回结果(中止/忽略方法的异步部分)

有关实现可作为结果使用的类的详细信息,请参见和

下面的框架代码显示了如何实现不执行任何操作的方法,除非调用
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();
}

听起来你好像缺少了等待是如何运作的概念。等待不会导致方法同步运行,它会导致调用方法的其余部分链接到返回的任务上。这是一个根本不同的概念。另外,你希望方法做什么呢?返回的任务被分配给一个变量,然后等待变量?是的,我完全理解你的意思。我“试图做的”肯定不是异步函数的预期用途。我只是想重新调整它的功能。对一些人来说,将相同的方法用于两种不同的事情会让人困惑,但对我来说效果很好。所以,出于好奇和兴趣,我决定提问。^^注意,@user1937198暗示,即使您可以分析代码,也不可能知道是否在等待方法调用的结果:
var lockTask=Lock();如果(userInput==true)等待lockTaskl。这是接近CS课程可能涵盖0考虑采取一个…这也是正确的,但是,这个问题将如何与<代码>异步空洞< /代码>而不是<代码>异步任务< /代码>方法?这个“窍门”非常有趣!非常感谢您分享您的知识!