线程创建

本文关键字:创建 线程 | 更新日期: 2023-09-27 18:25:39

请查看以下代码。我正在研究C#中的多线程。这个例子取自一些手册。在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();
    }
}

线程创建

这个问题纯粹是语法问题。当你写

MonitorMethodAccess.IncrementNumericField

此表达式的计算结果为方法本身。当你写

MonitorMethodAccess.IncrementNumericField()

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

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

但是,如果您想像在第三个线程中那样从线程返回值,您应该考虑使用Tasks