次の方法で共有


lock ステートメントとスレッド同期に関連するエラーと警告

lock ステートメントとスレッド同期に関連し、いくつかのエラーがあります。

  • CS0185: 'type' は lock ステートメントによって要求された参照型ではありません。
  • CS1996: lock ステートメントの本体で待機することはできません
  • CS9217: 'System.Threading.Lock' 型の値の lock ステートメントは、非同期メソッドでも非同期ラムダ式でも使用できません。

さらに、コンパイラによって、lock ステートメントとスレッドの同期に関連する次の警告が生成される場合があります。

  • CS9216: 別の型に変換された型 System.Threading.Lock の値では、意図しないモニター ベースのロックが lock ステートメントで使用される可能性があります。

lock ステートメント エラー

  • CS0185: 'type' は lock ステートメントによって要求された参照型ではありません。
  • CS1996: lock ステートメントの本体で待機することはできません
  • CS9217: 'System.Threading.Lock' 型の値の lock ステートメントは、非同期メソッドでも非同期ラムダ式でも使用できません。

これらのエラーは、コードが lock ステートメントに関する規則に違反していることを示しています。

  • lock 対象のオブジェクトは、参照型である必要があります。 値の型は使用できません。
  • await 式は、lock ステートメントのスコープでは使用できません。
  • lock ステートメントは、async メソッドまたはラムダ式では使用できません。 このエラーでは、ロックされているオブジェクトの種類を別の型に置き換えることができます。 lock ステートメントでは、Monitor API を使用します。

lock ステートメントの規則に従ってコードを更新する必要があります。

lock の警告

  • CS9216: 別の型に変換された型 System.Threading.Lock の値では、意図しないモニター ベースのロックが lock ステートメントで使用される可能性があります。

C# 13 以降では、ターゲット オブジェクトが System.Threading.Lock オブジェクトである場合に、lock によって特殊なコードが生成されます。 コンパイラは、Lock オブジェクトの使用時にこの警告を生成しますが、コードはその型を別の型に変換します。 そのため、コンパイラは、Lock 型に固有のロック コードでなく、一般的なロック コードを生成します。 次に例を示します。

object lockObject = new System.Threading.Lock();

lock (lockObject) // CS9216
{
    // .. Your code
}

変数または式が、Lock オブジェクトの型を表していることを確認する必要があります。