【发布时间】:2013-05-13 02:10:17
【问题描述】:
我有一个ConcurrentQueue 类型的静态字段:
static readonly ConcurrentQueue<int> q = new ConcurrentQueue<int>();
还有一个异步方法:
static async Task<int?> NextNum()
{
int? n = await Task.Run<int?>(() =>
{
int i = 0;
if (q.TryDequeue(out i)) return i;
return null;
});
return n;
}
然后我执行这段代码:
var nt = NextNum();
q.Enqueue(10);
nt.Wait();
Console.WriteLine("{0}", nt.Result.HasValue ? nt.Result.Value : -1);
输出是10。
现在我将MethodImpl 属性添加到我的异步方法中:
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
static async Task<int?> NextNum()
{
int? n = await Task.Run<int?>(() =>
{
int i = 0;
if (q.TryDequeue(out i)) return i;
return null;
});
return n;
}
当我执行前面提到的代码时,我得到-1。
问题:这是否意味着在异步方法中返回的任务不会立即启动?如果我们添加MethodImpl(带有AggressiveInlining)属性,它会立即启动吗?
我想知道用 AggressiveInlining 修饰的方法是否对任务调度程序的行为有任何影响。
【问题讨论】:
标签: c# task-parallel-library async-await c#-5.0 methodimplattribute