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

  • ethr95awd

    ethr95awd

    8 Kasım 2006
  • inovationgmbh

    inovationgmb

    28 EYLÜL 2010
  • stokelycalm

    stokelycalm

    28 Aralık 2010