1

次のコードを見てください。C# でのマルチスレッディングについて頭を悩ませています。この例は、いくつかのマニュアルから取られました。私の Main 関数では、3 つのスレッドを作成しようとしています。

2 つのスレッド (エラーあり) を適切に作成する方法を教えてください。
ありがとうございました!

using System;    
using System.Threading;    


public static class MonitorMethodAccess
{
   private static int numericField = 1;
   private static object syncObj = new object();

public static object SyncRoot
{
    get { return syncObj; }
}

public static void IncrementNumericField()
{
    if (Monitor.TryEnter(syncObj, 250))
    {
        try
        {
            ++numericField;
        }
        finally
        {
            Monitor.Exit(syncObj);
        }

    }
}

public static void ModifyNumericField(int newValue)
{
    if (Monitor.TryEnter(syncObj, 250))
    {
        try
        {
            numericField = newValue;
        }
        finally
        {
            Monitor.Exit(syncObj);
        }
    }
}

public static int ReadNumericField()
{
    if (Monitor.TryEnter(syncObj, 250))
    {
        try
        {
            return (numericField);
        }
        finally
        {
            Monitor.Exit(syncObj);
        }
    }

    return (-1);
}

}

class Program
{
    static void Main(string[] args)
    {
        Thread aaa = new Thread(MonitorMethodAccess.IncrementNumericField);
        Thread bbb = new Thread(MonitorMethodAccess.ModifyNumericField(12);//error
        Thread ccc = new Thread(MonitorMethodAccess.ReadNumericField);//error

        Console.ReadKey();
    }
}
4

2 に答える 2

2

質問は純粋に構文です。あなたが書くとき

MonitorMethodAccess.IncrementNumericField

この式は、メソッド自体に評価されます。あなたが書くとき

MonitorMethodAccess.IncrementNumericField()

この式は、この場合、メソッドの呼び出しの結果として評価されますvoid。スレッドに渡すことはできませんvoid。スレッドは、メソッドまたはデリゲートを想定しており、パラメーターをとらないものを想定しています。問題は、メソッドといくつかの特定のパラメーターを渡す方法です。I4V で指摘されているように、それ自体はパラメーターを取らないラムダ式でラップできます。

Action methodInvocation = (Action)(() => MonitorMethodAccess.ModifyNumericField(12));
Thread bbb = new Thread(methodInvocation);
于 2013-07-31T21:13:30.157 に答える