Katakanlah saya memiliki 100 kelas yang mengimplementasikan antarmuka umum dengan metode "menghitung". Beberapa kelas akan menjalankan async (misalnya membaca file), dan kelas lain yang mengimplementasikan antarmuka yang sama akan mengeksekusi kode yang disinkronkan (misalnya menambahkan dua angka). Apa cara yang baik untuk mengkodekan ini, untuk pemeliharaan dan kinerja?
Postingan yang saya baca sejauh ini, selalu merekomendasikan untuk membuat metode async/menunggu muncul di hadapan penelepon. Jadi, jika Anda memiliki satu operasi yang async, jadikan pemanggilnya async, lalu pemanggilnya async, dan seterusnya. Jadi ini membuat saya berpikir bahwa antarmukanya harus berupa antarmuka async. Namun, hal ini menimbulkan masalah ketika mengimplementasikan antarmuka dengan kode yang sinkron.
Salah satu ide yang saya pikirkan adalah mengekspos 2 metode antarmuka, satu async dan satu sinkronisasi, dan satu properti boolean untuk memberi tahu pemanggil metode mana yang harus dipanggil. Ini akan terlihat sangat jelek.
Kode yang saya miliki saat ini hanya satu metode antarmuka yaitu async. Kemudian untuk implementasi yang sinkron, mereka membungkus kode di dalam objek Task:
using System.IO;
using System.Threading.Tasks;
namespace TestApp
{
interface IBlackBox
{
Task<string> PullText();
}
sealed class MyAsyncBlackBox : IBlackBox
{
public async Task<string> PullText()
{
using (var reader = File.OpenText("Words.txt"))
{
return await reader.ReadToEndAsync();
}
}
}
sealed class MyCachedBlackBox : IBlackBox
{
public Task<string> PullText()
{
return Task.Run(() => "hello world");
}
}
}
Apakah ini pendekatan yang tepat untuk membuat dan mengimplementasikan antarmuka yang terkadang tidak sinkron? Saya memiliki banyak kelas yang mengimplementasikan operasi sinkron pendek, dan khawatir hal ini dapat menambah banyak overhead. Apakah ada cara lain untuk melakukan ini yang saya lewatkan?
Task.Run(...)
, gunakanTask.FromResult(...);
. Perpustakaan Anda tidak boleh menggunakanTask.Run(...)
karena itu akan menggunakan thread baru (semacamnya, ini lebih rumit dari itu) daripada hanya berjalan di thread yang sedang dijalankan. - person Nelson   schedule 01.04.2019