नीचे दिए गए कोड में, इंटरफ़ेस के कारण, कक्षा 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)
।