Gejala

.NET Framework 4.6 ditambahkan enum Ketik nilai yang baru, RunContinuationsAsynchronously, enums TaskCompletionSource dan TaskCreationOptions . Nilai ini memaksa tugas untuk menjalankan asinkron, dan ini akan membantu mencegah kemogokan situasi. Namun, masalah telah ditemukan di mana, untuk beberapa jenis khusus continuations (khususnya ketika Task.WhenAll, Task.WhenAnyatau TaskExtensions.Unwrap membuat continuations), opsi diabaikan. Oleh karena itu, continuations mungkin masih berjalan serentak.

Contoh berikut ini menunjukkan masalah tersebut. Jika nilai RunContinuationsAsynchronously telah berfungsi dengan baik, thread dua id yang akan dicetak tidak akan sama, karena kelanjutan akan dijadwalkan ke kain yang berbeda.

using System;using System.Threading;
using System.Threading.Tasks;

class Program
{
static void Main()
{
var mres = new ManualResetEventSlim();

Console.WriteLine(Environment.CurrentManagedThreadId);

var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);

var t = Task.WhenAll(tcs.Task);

t.ContinueWith(delegate
{
Console.WriteLine(Environment.CurrentManagedThreadId);
mres.Set();
}, TaskContinuationOptions.ExecuteSynchronously);

tcs.SetResult(true);
mres.Wait();
}
}

Pemecahan masalah

Saat ini tidak ada penyelesaian untuk masalah ini. Microsoft .NET Framework tim bekerja pada solusi yang termasuk dalam pembaruan masa mendatang.


Perlu bantuan lainnya?

Kembangkan keterampilan Anda

JELAJAHI PELATIHAN >

Dapatkan fitur baru terlebih dahulu

GABUNG MICROSOFT INSIDER >

Apakah informasi ini bermanfaat?

Seberapa puaskah Anda dengan kualitas bahasanya?
Apa yang memengaruhi pengalaman Anda?

Terima kasih atas umpan balik Anda!

×