Anda mendapatkan kesalahan itu karena Task
kelas sudah memulai tugas sebelum memberikannya kepada Anda. Anda hanya boleh memanggil Start
tugas yang Anda buat dengan memanggil konstruktornya, dan Anda bahkan tidak boleh melakukannya kecuali Anda memiliki alasan kuat untuk tidak memulai tugas saat Anda membuatnya; jika Anda menginginkannya segera dimulai, Anda harus menggunakan Task.Run
atau Task.Factory.StartNew
keduanya membuat dan memulai yang baru Task
.
Jadi, sekarang kita tahu untuk menyingkirkan masalah itu Start
. Anda akan menjalankan kode Anda dan menemukan bahwa kotak pesan langsung ditampilkan, bukan 5 detik kemudian, ada apa dengan itu?
Nah, Task.Delay
memberi Anda tugas yang akan selesai dalam 5 detik. Itu tidak menghentikan eksekusi utas selama 5 detik. Yang ingin Anda lakukan adalah memiliki beberapa kode yang dijalankan setelah tugas itu selesai. Untuk itulah ContinueWith
. Ini memungkinkan Anda menjalankan beberapa kode setelah tugas tertentu selesai:
public void FunctionA()
{
Task.Delay(5000)
.ContinueWith(t =>
{
MessageBox.Show("Waiting Complete");
});
}
Ini akan berperilaku seperti yang diharapkan.
Kami juga dapat memanfaatkan await
kata kunci C # 5.0 untuk menambahkan kelanjutan dengan lebih mudah:
public async Task FunctionA()
{
await Task.Delay(5000);
MessageBox.Show("Waiting Complete");
}
Meskipun penjelasan lengkap tentang apa yang terjadi di sini berada di luar cakupan pertanyaan ini, hasil akhirnya adalah metode yang berperilaku sangat mirip dengan metode sebelumnya; itu akan menampilkan kotak pesan 5 detik setelah Anda memanggil metode tersebut, tetapi metode itu sendiri akan kembali [hampir] segera dalam kedua kasus tersebut. Yang mengatakan, await
sangat kuat, dan memungkinkan kita untuk menulis metode yang tampak sederhana dan lugas, tetapi itu akan jauh lebih sulit dan lebih berantakan untuk menulis menggunakan ContinueWith
secara langsung. Ini juga sangat menyederhanakan penanganan kesalahan, mengambil banyak kode boilerplate.
Wait()
tugas akan memblokir utas saat ini hingga tugas terselesaikan. Itu hampir tidak pernah Anda inginkan terjadi.