2

ロック構造内で非同期操作を使用することは、プログラミングの良い方法ですか。たとえば、

lock(objLocker)
{

    myDispatchder.BeginInvoke(
        System.Windows.Threading.DispatcherPriority.Render,
        new Action(() =>
                    {
                      // ..code..

                    }
}
4

2 に答える 2

7

それがあなたが保護している唯一のものである場合、それは冗長になります。する必要はありませlockBeginInvoke。実際、これがであり、( )と呼ばれるメソッドロックを取得しようとすると、非常に有害です。つまり、デッドロックになります。現時点では、何の役にも立たず、今後 3 つのメンテナンス リリースに害を及ぼす可能性があります。より一般的なケースでは、保護が必要なものある場合、2 つのタスクを分離します。つまり、Invoke// ..code..objLocker

lock(objLocker)
{
    // do some stuff
}
myDispatcher.BeginInvoke(...);

これにより、後で潜在的な問題が回避されます。

于 2012-10-12T09:43:29.370 に答える
3

a内の非同期操作は、lock理由もなくコードをより複雑にし、デッドロックの可能性を導入する以外は何もしません。

あなたのコード例を挙げてください。私は以下がおそらくはるかに有用であることを示唆することができます:

myDispatchder.BeginInvoke(
    System.Windows.Threading.DispatcherPriority.Render,
    new Action(() =>
    {
        lock(objLocker)
        {
            // ..code..
        }
    }));
于 2012-10-12T10:05:38.060 に答える