Aşağıdaki kodda, arabirim nedeniyle, sınıfın LazyBar
yönteminden bir görev döndürmesi gerekir (ve sake argümanları değiştirilemez). Eğer LazyBar
yönteminden bir No-Operasyon görevi döndürmek için en iyi yolu nedir - s uygulaması hızla ve eşzamanlı çalışmasına olur sıradışı mı?
Birlikte gitmiş Task.Delay(0)
ancak işlevi denir, bu herhangi bir performans yan etkileri varsa bilmek istiyorum, aşağıda çok (kez ikinci yüzlerce argümanlar uğruna, derler):
- Bu sözdizimsel şeker büyük bir şeye yöneliyor mu?
- Uygulamamın iş parçacığı havuzunu tıkamaya mı başlıyor?
- Derleyici
Delay(0)
farklı şekilde başa çıkmak için yeterli mi? - Misiniz
return Task.Run(() => { });
farklı olsun?
Daha iyi bir yol var mı?
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)
.