Dalam kode di bawah ini, karena antarmuka, kelas LazyBar
harus mengembalikan tugas dari metode itu (dan demi argumen tidak dapat diubah). Jika LazyBar
implementasi tidak biasa terjadi karena berjalan dengan cepat dan serempak - apa cara terbaik untuk mengembalikan tugas Tanpa Operasi dari metode ini?
Saya telah membahas di Task.Delay(0)
bawah ini, namun saya ingin tahu apakah ini memiliki efek samping kinerja jika fungsinya disebut banyak (demi argumen, katakan ratusan kali per detik):
- Apakah gula sintaksis ini melepaskan angin ke sesuatu yang besar?
- Apakah itu mulai menyumbat kumpulan utas aplikasi saya?
- Apakah golok compiler cukup untuk menangani secara
Delay(0)
berbeda? - Apakah
return Task.Run(() => { });
akan berbeda?
Apakah ada cara yang lebih baik?
using System.Threading.Tasks;
namespace MyAsyncTest
{
internal interface IFooFace
{
Task WillBeLongRunningAsyncInTheMajorityOfImplementations();
}
/// <summary>
/// An implementation, that unlike most cases, will not have a long-running
/// operation in 'WillBeLongRunningAsyncInTheMajorityOfImplementations'
/// </summary>
internal class LazyBar : IFooFace
{
#region IFooFace Members
public Task WillBeLongRunningAsyncInTheMajorityOfImplementations()
{
// First, do something really quick
var x = 1;
// Can't return 'null' here! Does 'Task.Delay(0)' have any performance considerations?
// Is it a real no-op, or if I call this a lot, will it adversely affect the
// underlying thread-pool? Better way?
return Task.Delay(0);
// Any different?
// return Task.Run(() => { });
// If my task returned something, I would do:
// return Task.FromResult<int>(12345);
}
#endregion
}
internal class Program
{
private static void Main(string[] args)
{
Test();
}
private static async void Test()
{
IFooFace foo = FactoryCreate();
await foo.WillBeLongRunningAsyncInTheMajorityOfImplementations();
return;
}
private static IFooFace FactoryCreate()
{
return new LazyBar();
}
}
}
Task.FromResult<object>(null)
.