我有两个函数a,b它们是异步的,前者没有await,后者则是await.他们都记录了一些东西到控制台并返回undefined.在调用任一函数后,我记录另一条消息,并查看是否在执行函数体之前或之后写入消息.
function someMath() {
for (let i = 0; i < 3000000; i++) { Math.sqrt(i**5) }
}
function timeout(n) {
return new Promise(cb => setTimeout(cb, n))
}
// ------------------------------------------------- a (no await)
async function a() {
someMath()
console.log('in a (no await)')
}
// ---------------------------------------------------- b (await)
async function b() {
await timeout(100)
console.log('in b (await)')
}
clear.onclick = console.clear
aButton.onclick = function() {
a()
console.log('after a (no await) call')
} …Run Code Online (Sandbox Code Playgroud)考虑在没有等待的情况下使用async.
想想也许你误解了异步的作用.警告是完全正确的:如果您将方法标记为异步但不在任何地方使用等待,那么您的方法将不是异步的.如果调用它,方法中的所有代码将同步执行.
我想编写一个应该运行异步但不需要使用await的方法.例如,当使用线程时
public async Task PushCallAsync(CallNotificationInfo callNotificationInfo)
{
Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId,
}
Run Code Online (Sandbox Code Playgroud)
我想要调用PushCallAsync并运行异步,不想使用等待.
我可以在C#中使用async而无需等待吗?
在我的方法中,RecalcChartAsync我做了一些时间密集的东西..所以我想我会做一些事情异步.
我想开始这两个方法CreateHistogramAsync CalculatePropValuesAsync,同时在我做一些东西RecalcChartsAsync,最后等待它完成.
private async void RecalcChartsAsync()
{
var histogram = CreateHistogramAsync();
var propValues = CalculatePropValuesAsync();
//do some other stuff
await histogram;
await propValues;
}
private async Task CreateHistogramAsync()
{
//do some stuff
}
private async Task CalculatePropValuesAsync()
{
//do some stuff
}
Run Code Online (Sandbox Code Playgroud)
我不确定我是否采用正确的方式,因为ReSharper在CreateHistogramAsync和CalculatePropValueAsync的异步关键字上给出了以下警告:
这种异步方法缺少"等待"运算符并将同步运行.考虑使用await运算符等待非阻塞API调用,...
现在我不确定我是否以正确的方式使用这个异步的东西.
任何人都可以解释为什么c#5中的异步函数需要至少有1个等待?我找不到明确的理由/解释.
根据需要,我的意思是编译器在async函数内部没有任何await调用时发出警告,但不会抛出编译错误.
从这个答案:
同样,标记为async的方法必须至少有一个等待.在await上,运行时将保存当前线程的状态和调用堆栈,进行异步调用,并展开回运行时的消息循环以处理下一条消息并保持应用程序的响应.当异步操作完成时,在下一个调度机会时,用于启动异步操作的调用堆栈将被推回并继续,就像调用是同步的一样.
但是来自msdn:
如果该方法不包含await表达式或语句,则它将同步执行.编译器警告会提醒您任何不包含等待的异步方法,因为这种情况可能表示错误.
发生什么类型的错误,这是一个编译器警告而不仅仅是推荐的用法?
当我尝试运行下面的代码时,执行同步操作.为什么?
我收到以下警告......
警告1此异步方法缺少"等待"操作符并将同步运行.考虑使用'await'运算符等待非阻塞API调用,或'await Task.Run(...)'在后台线程上执行CPU绑定工作.
private async void btProcessa_Click(object sender, EventArgs e)
{
await ProcessaA();
await ProcessaB();
}
public async Task ProcessaA()
{
for (int i = 0; i <= 100; i++)
{
pbProcessoA.Value = i;
Thread.Sleep(500);
}
}
public async Task ProcessaB()
{
for (int i = 0; i <= 100; i++)
{
pbProcessoB.Value = i;
Thread.Sleep(500);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在为Windows Phone 8+应用程序开发图像加载器库,当然它支持磁盘上的缓存.
因此,我需要异步保存磁盘上的映像而不等待结果:
// Async saving to the storage cache without await
// ReSharper disable once CSharpWarnings::CS4014
Config.StorageCacheImpl.SaveAsync(imageUrl, downloadResult.ResultStream)
.ContinueWith(
task =>
{
if (task.IsFaulted || !task.Result)
{
Log("[error] failed to save in storage: " + imageUri);
}
}
);
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,SaveAsync()是异步方法并返回Task<bool>,bool如果保存图像,则结果为true.
问题是编译器显示警告,因为我没有等待异步方法的结果,但是,我不需要等待它,我需要尽可能快地将下载的图像返回给用户代码,在SaveAsync()我调用之后返回下载的图片.
所以我异步地将图像缓存到IsolatedStorageFile而且 - 它没关系,它是否会被缓存,因为如果没有 - JetImageLoader将再次加载它.
是否可以禁用此警告?
PS如果你想看JetImageLoader来源,我可以给你一个GitHub的链接.