নীচের কোডে, ইন্টারফেসের কারণে, শ্রেণিকে LazyBar
অবশ্যই তার পদ্ধতি থেকে কোনও কাজ ফিরে আসতে হবে (এবং যুক্তিগুলির কারণে পরিবর্তন করা যায় না)। যদি LazyBar
এর বাস্তবায়ন অস্বাভাবিক হয় যে এটি দ্রুত এবং সিঙ্ক্রোনিকভাবে চলতে দেখা যায় - পদ্ধতি থেকে কোনও অপারেশন টাস্ক ফেরত দেওয়ার সর্বোত্তম উপায় কী?
আমি Task.Delay(0)
নীচে নিয়ে গিয়েছি , তবে আমি জানতে চাই যে ফাংশনটিকে অনেক বলা হয়ে থাকলে এর কোনও পারফরম্যান্স-পার্শ্ব-প্রতিক্রিয়া রয়েছে কিনা (যুক্তি দেখানোর জন্য, কয়েক সেকেন্ডে কয়েকবার বলুন):
- এই সিনট্যাকটিক চিনির কি বড় কিছু হতে পারে?
- এটি কি আমার অ্যাপ্লিকেশনটির থ্রেড পুলটি আটকে রাখতে শুরু করে?
- সংকলক ছাড়পত্র কি
Delay(0)
আলাদাভাবে মোকাবেলা করার জন্য যথেষ্ট ? - চান
return Task.Run(() => { });
কোন আলাদা হতে?
একটি ভাল উপায় আছে কি?
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)
।