SORU
30 EYLÜL 2011, Cuma


Neden't use 'kilit deyiminin gövdesinde' operatör bekliyor olabilir?

C anahtar kelime bekliyor# (.NET Uyumsuz CTP) kilit bir deyim içinde izin verilmez.

MSDN:

Bir ifadesi kullanılamaz bekliyorsorguda zaman uyumlu bir işlev içinde, eğer yakalamak ya da sonunda bir özel durum işleme bloğu ifade deyimkilit bir deyim öbeğiya da güvensiz bir bağlamda.

Bu da zor ya da derleyici takım nedense uygulamak için imkansız olduğunu düşünüyorum.

Geçici bir çözüm kullanarak ifade ile çalıştı:

class Async
{
    public static async Task<IDisposable> Lock(object obj)
    {
        while (!Monitor.TryEnter(obj))
            await TaskEx.Yield();

        return new ExitDisposable(obj);
    }

    private class ExitDisposable : IDisposable
    {
        private readonly object obj;
        public ExitDisposable(object obj) { this.obj = obj; }
        public void Dispose() { Monitor.Exit(this.obj); }
    }
}

// example usage
using (await Async.Lock(padlock))
{
    await SomethingAsync();
}

Ancak bu beklendiği gibi çalışmıyor. Aramayı İzlemek için.ExitDisposable içinde çıkın.Atın süresiz olarak (çoğu zaman) başka bir iş parçacığı kilit alma girişimi olarak kilitlenmeleri neden blok gibi görünüyor. Ve nedenini açıklamaları kilit deyim içinde izin verilmez bekliyor etrafında benim çalışma kaypaklık bir şekilde ilgili olduğunu sanıyorum.

Herkes biliyor munedenkilit bir deyim içinde izin verilmez bekliyor?

CEVAP
30 EYLÜL 2011, Cuma


Bu da zor ya da derleyici takım nedense uygulamak için imkansız olduğunu düşünüyorum.

Hayır, bu bir vasiyettir kendinizi hiç ya ... uygulanan gerçeğini uygulamak zor değil imkansızdır. Daha doğrusuinanılmaz kötü bir fikirdirve bu yüzden hata yapmaktan korumak için buna izin vermez.

İzlemek için arayın.ExitDisposable içinde çıkın.Atın süresiz olarak (çoğu zaman) başka bir iş parçacığı kilit alma girişimi olarak kilitlenmeleri neden blok gibi görünüyor. Ve nedenini açıklamaları kilit deyim içinde izin verilmez bekliyor etrafında benim çalışma kaypaklık bir şekilde ilgili olduğunu sanıyorum.

Doğru, yasa dışı yapılmış keşfettim.Kilit bekliyor kilitlenmeleri üretmek için bir tarif.

Nedenini anlayacağınızdan eminimrasgele bir kod bekliyor zaman arayan ve Yöntem çağrıldıktan için kontrol döner arasında çalışır. Bu keyfi sipariş kodu terslenmenin ve bu nedenle kilit kilitlenmeleri üreten kilitleri yaptırmayı olabilir.

Daha da kötüsükodu başka bir konu üzerinde devam edebilir(gelişmiş senaryolar; normalde seni almaya tekrar iplik yaptı, bekliyor, ama şart değil) bu durumda kilidini olacaktır Anahtarcı bir kilit daha farklı bir iş parçacığı iş parçacığı çıkardı kilit. Bu iyi bir fikir mi? Hayır.

Ayrıca, "yield return içinde lock, aynı sebepten. bir yapmak için" en kötü uygulama olduğunu unutmayın Bunu yapmak için yasal ama yasa dışı olsun isterdim. Aynı hatayı yapmayacağız "" sesini bekleyin.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FRED

    FRED

    1 EKİM 2005
  • itfigueres

    itfigueres

    12 EKİM 2013
  • tychoadragmire

    tychoadragmi

    20 Mart 2006