首页 \ 问答 \ 如何知道我的异步方法正在等待?(How to know my async method is being awaited?)

如何知道我的异步方法正在等待?(How to know my async method is being awaited?)

是否可以知道我的方法是否使用'await'关键字进行调用?

例如; 方法MyAsync()想知道是否等待它。

public void CallForBackground()
{
    MyAsync();
}

public async void CallAsync()
{
    bool result = await MyAsync();
}

public Task<bool> MyAsync()
{
    return Task.Run(() =>
    {
    //do something endlessly if its being called without 'await', but how do I know the caller is 'await'ing or not?
    //do something only once if its being called with 'await', but how do I know the caller is 'await'ing or not?


    return true;
    });
}

编辑:添加了一个场景,我想知道是否使用'await'调用MyAsync();

1)假设MyAsync()使用TCP连接到远程服务器。

2)MyAsync()是异步的并且是等待的。

3)假设UserA想要异步连接到远程服务器,一旦完成,他/她想要在继续​​他的过程之前知道它是否成功。 类似于CallAsync()方法实现的东西。

4)UserB想要触发MyAsync()方法,而不是等待它完成。 在这种情况下,UserB在向远程服务器发送消息之前不关心它是否已连接。 类似于CallForBackground()方法实现的东西。

因此,对于UserA(等待),MyAsync()方法将尝试一次并返回状态。 但对于UserB(不等待),方法将继续尝试。 对于这个逻辑,MyAsync()需要知道它是否正在等待。 我们如何实现这一目标?


Is it possible to know that my method is being called using 'await' keyword or not?

For example; method MyAsync() would like to know whether its being awaited or not.

public void CallForBackground()
{
    MyAsync();
}

public async void CallAsync()
{
    bool result = await MyAsync();
}

public Task<bool> MyAsync()
{
    return Task.Run(() =>
    {
    //do something endlessly if its being called without 'await', but how do I know the caller is 'await'ing or not?
    //do something only once if its being called with 'await', but how do I know the caller is 'await'ing or not?


    return true;
    });
}

EDITED: Added a scenario where I would like to know whether MyAsync() is being called with or without 'await';

1) Let's say MyAsync() is connecting to a remote server using TCP.

2) MyAsync() is asynchronous and awaitable.

3) Let's say UserA wanted to connect to remote server asynchronously and once completed he/she would like to know whether it was successful or not before continuing his process. Something similar to CallAsync() method implementation.

4) And UserB wants to fire MyAsync() method, without waiting for it to complete. In this case, UserB don't care whether it was connected or not until he sends a message to remote server. Something similar to CallForBackground() method implementation.

So for UserA (awaiting) MyAsync() method will attempt once and return the status. But for UserB (not awaiting), method will keep trying. For this logic, MyAsync() needs to know whether its being awaiting or not. How do we achieve this?


原文:https://stackoverflow.com/questions/23976247
更新时间:2019-12-03 08:12

最满意答案

我们如何实现这一目标?

你不*。 根据用户对其返回值的作用,方法的行为不应该有所不同。 如果您想要有两种不同的行为,请在方法中添加bool参数,或者更好的是,为此设置两种不同的方法。


*实际上有一种方法await你的方法是否await 。 但它很复杂(它涉及使用自定义等待者而不是Task ),我不认为这是正确的解决方案。


How do we achieve this?

You don't*. A method shouldn't behave differently depending on what the user does to its return value. If you want to have two different behaviors, either add a bool parameter to your method, or, even better, have two separate methods for this.


* Actually there is a way to find out whether your method was awaited. But it's quite complicated (it involves using custom awaiters instead of Task) and I don't think it's the right solution here.

2014-06-01

相关文章

更多

最新问答

更多
  • jsPlumb draggable element javascript函数(jsPlumb draggable element javascript function)
  • MVC4:ViewModel(带有radiobuttonlist)在HttpPost之后为空(MVC4: ViewModel (with radiobuttonlist) is empty after HttpPost)
  • 如何在同一帐户上设置“Dev repo”(在prod和团队之间)(How to set up a “Dev repo” (between the prod and the team) on the same account)
  • 如何在tcl中将eth0配置为发送方udp端口(how to configure eth0 as a sender udp port in tcl)
  • 如何在datarow []中的列中找到最大值?(How to find max value in a column in a datarow[] ?)
  • 如何使用预定义文本替换来自数据库的部分结果(How do I replace part of result coming from Database with predefined text)
  • Selenium Java注入了新的Javascript函数(Selenium Java inject new Javascript function)
  • 使用.on的多个下拉菜单选择文本仅适用于第一个下拉列表(Multiple Dropdowns Menu Selection text using .on works only on first dropdown)
  • 快速将黄土曲线添加到大型数据集图中的方法(Quick way to add loess curve to large data set graph)
  • FilteringSelect in mvc(FilteringSelect in mvc)
  • 在Delphi XE2中开发Mac或iOS应用程序需要哪些硬件/软件?(What hardware/software is necessary to develop Mac or iOS apps in Delphi XE2?)
  • 在原型的构造函数中初始化属性时获取“未定义”(Getting 'undefined' when a property is initialized in the constructor of a prototype)
  • 通过越狱加载的应用程序的Documents文件夹位置(Location of Documents folder for an app loaded via jailbreak)
  • 在OpenGL中使用可编程和固定管道功能(Using both programmable and fixed pipeline functionality in OpenGL)
  • 将任何用户输入重定向到单独的底层程序(redirect any user input to a separate underlying program)
  • 编辑文本不能正常工作android(Edit texts not working properly android)
  • “user_denied”Facebook应用页面上的Facebook用户区域设置(Facebook user locale on “user_denied” facebook app page)
  • 在大图像中找到小的部分透明图像的坐标(find coordinates of small partially-transparent image within a large image)
  • 我如何在cakephp 3.1中获得完整的相对路径?(How i can get full relative path of image in cakephp 3.1?)
  • 如何保存拖动标记的新本地化?(How to save new localization of dragged marker?)
  • MySQL UPDATE vs INSERT和DELETE(MySQL UPDATE vs INSERT and DELETE)
  • 在执行查询之前,在SQLAlchemy模型中将datetime转换为unix时间戳?(Convert datetime to unix timestamp in SQLAlchemy model before executing query?)
  • OpenCL与OpenGL互操作的优势(Advantage of OpenCL interoperability with OpenGL)
  • 如何解析用点和等分隔的数据然后添加到listview(How to parsing data from delimited with dot and equal then add to listview)
  • 带调试输出的X3解析器段错误(BOOST_SPIRIT_X3_DEBUG)(X3 parser segfaults with debug output (BOOST_SPIRIT_X3_DEBUG))
  • 将文件夹名称添加到fgrep结果(Add folder name to fgrep result)
  • 在MySQL中加载一个表是非常慢的(Loading one table in MySQL is ridiculously slow)
  • 如何将JSON放入PHP变量?(How do I put JSON into a PHP Variable?)
  • 如何绕过Microsoft.Speech.Recognition中的不流畅?(How to bypass disfluencies in Microsoft.Speech.Recognition?)
  • 原点的最后一行是什么?(What is the last row of an origin for?)