Trong mã bên dưới, do giao diện, lớp LazyBar
phải trả về một tác vụ từ phương thức của nó (và đối với các đối số không thể thay đổi). Nếu LazyBar
việc triển khai không bình thường ở chỗ nó chạy nhanh và đồng bộ - cách tốt nhất để trả về tác vụ Không hoạt động từ phương thức là gì?
Tôi đã đi với Task.Delay(0)
bên dưới, tuy nhiên tôi muốn biết liệu điều này có bất kỳ tác dụng phụ hiệu suất nào không nếu chức năng được gọi rất nhiều (đối với lợi ích, nói hàng trăm lần một giây):
- Liệu cú pháp đường này không gió đến một cái gì đó lớn?
- Nó có bắt đầu làm tắc nghẽn nhóm chủ đề của ứng dụng của tôi không?
- Là trình biên dịch cleaver đủ để đối phó với
Delay(0)
khác nhau? - Sẽ
return Task.Run(() => { });
khác nhau chứ?
Có cách nào tốt hơn?
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)
.