タイプの静的フィールドがあります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
.
質問: これは、非同期メソッドでは、返された Task がすぐに開始されないということですか? MethodImpl
そして、 (with で) 属性を追加すると、AggressiveInlining
すぐに開始されますか?
AggressiveInlining で装飾されたメソッドがタスク スケジューラの動作に影響を与えるかどうかを知りたいです。