我在.NET平台上使用Xunit和NMock.我正在测试一个方法是异步的表示模型.该方法创建一个异步任务并执行它,以便该方法立即返回,我需要检查的状态尚未准备好.
我可以在完成时设置一个标志而不修改SUT但这意味着我必须继续检查while循环中的标志,例如,可能超时.
我有什么选择?
此代码抛出异常.是否可以定义将捕获它的应用程序全局处理程序?
string x = await DoSomethingAsync();
Run Code Online (Sandbox Code Playgroud)
使用.net 4.5/WPF
是否可以知道我的方法是否使用'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;
});
}
Run Code Online (Sandbox Code Playgroud)
编辑:添加了一个场景,我想知道是否使用'await'调用MyAsync();
1)假设MyAsync()使用TCP连接到远程服务器.
2)MyAsync()是异步的并且是等待的.
3)假设UserA想要异步连接到远程服务器,一旦完成,他/她想在继续他的过程之前知道它是否成功.类似于CallAsync()方法实现的东西.
4)UserB想要触发MyAsync()方法,而不是等待它完成.在这种情况下,UserB在向远程服务器发送消息之前不关心它是否已连接.类似于CallForBackground()方法实现的东西.
因此,对于UserA(等待),MyAsync()方法将尝试一次并返回状态.但对于UserB(不等待),方法将继续尝试.对于这个逻辑,MyAsync()需要知道它是否正在等待.我们如何实现这一目标?
我可以使用Task.Run这样的方式执行异步操作
await Task.Run(() =>
{
DoSomeIOStuff();
//throw new Exception("Custom Exception");
});
Run Code Online (Sandbox Code Playgroud)
有时我需要返回一个值
bool success = await Task.Run(() => ...
Run Code Online (Sandbox Code Playgroud)
但有时我不这样做.我读过你应该永远不会有一个返回void的异步方法,因为除其他外,你可以得到丢失的异常(如本问题所述).我测试了上面的Task.Run调用,其中有一个例外,发现所有数据都已处理,这意味着即使我没有返回任何内容,Task.Run仍然会返回一个任务.然后我试了一下
var temp = await Task.Run(() =>
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误,我不能将void赋给变量,这是我期望的,但这让我想知道Task.Run返回什么.它表现得像是在返回一个没有任务的任务,所以虽然我认为这不是正在发生的事情,但我还没有找到任何关于它正在做什么的文档.有什么想法吗?