线程创建

时间:2013-07-31 20:59:13

标签: c# multithreading

请查看以下代码。 我在C#中了解MultiThreading。 这个例子来自一些手册。 在我的Main函数中,我尝试创建三个线程。

您能告诉我如何正确创建两个线程(有错误)吗? 谢谢!

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();
    }
}

2 个答案:

答案 0 :(得分:2)

问题纯粹是语法上的。当你写

MonitorMethodAccess.IncrementNumericField

此表达式计算方法本身。当你写

MonitorMethodAccess.IncrementNumericField()

此表达式求值为调用方法的结果,在本例中为void。你不能将void传递给一个线程,它需要一个方法或一个委托,一个不接受任何参数的方法。现在问题是如何实现传递方法和一些特定参数?正如I4V所指出的,你可以将它包装在一个lambda表达式中,该表达式本身不带参数:

Action methodInvocation = (Action)(() => MonitorMethodAccess.ModifyNumericField(12));
Thread bbb = new Thread(methodInvocation);

答案 1 :(得分:1)

Thread bbb = new Thread(()=>MonitorMethodAccess.ModifyNumericField(12));
Thread ccc = new Thread(() => MonitorMethodAccess.ReadNumericField());

但是如果你想在第三个帖子中返回线程中的值,你应该考虑使用Tasks