SORU
29 EKİM 2012, PAZARTESİ


Eğer benim arayüz Görevi iade etmelidir eğer hiçbir işlem, bir uygulama için en iyi yolu nedir?

Arayüzü nedeniyle aşağıdaki kod, bir sınıf LazyBar Bu yöntem (ve hatırı değiştirilemez bağımsız) görev almak gerekir. LazyBars uygulama alışılmadık bir hızla koşmak kendi başına var olan, eşzamanlı olarak ise yöntem Yok - İşlem görev almak için en iyi yolu nedir?

Task.Delay(0) ile aşağıda gitti, ancak bu herhangi bir performans işlevi çağrılırsa yan etkileri olup olmadığını bilmek istiyorumçoktartışmalar, diyelim ki saniyede yüzlerce kez uğruna ():

  • Bu şeker un-rüzgar büyük bir şey için sözdizimsel mu?
  • Benim uygulama iş parçacığı havuzu tıkar başlar?
  • Derleyici satır Delay(0) farklı ile başa çıkmak için yeterli mi?
  • return Task.Run(() => { }); herhangi bir farklı olurdu?

Daha iyi bir yolu 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();
        }
    }
}

CEVAP
29 EKİM 2012, PAZARTESİ


Task.FromResult(0) Task.FromResult<object>(null) kullanarak daha az yük Task bir oluşturma daha-op bir ifade ile tahakkuk edecektir. Sonucu önceden belirlenmiş olan Task oluştururken, zamanlama havai ilgisi yok.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • olinerd

    olinerd

    23 AĞUSTOS 2007
  • spederson7

    spederson7

    17 Temmuz 2006
  • Watcher3223

    Watcher3223

    15 Kasım 2007