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考虑采取一个…这也是正确的,但是,这个问题将如何与<代码>异步空洞< /代码>而不是<代码>异步任务< /代码>方法?这个“窍门”非常有趣!非常感谢您分享您的知识!