如何使用lambda表达式在C#中启动线程

11

我有这个类:

public class Statistics
{
    List<string> _lsit;

    public List<string> ipList
    {
        get { return _lsit; }
        set { _lsit = value; }
    }

    string _Path = @"C:\Program Files\myApp.exe";
    string _Path = "";
    ProcessStartInfo ps = null;

    public getStatistics(string Path)
    {
        _Path = Path;
        getStatistics();
    }
}

我想使用不同的Thead启动统计功能,我做了如下操作:

Statistics stat = new Statistics (some path);
Thread<List<string>> lList = new Thread<List<string>>(() => tsharkIps.getStatistics());

但编译器错误显示“非泛型类型'System.Threading.Thread'不能与类型参数一起使用”

我没有编写全部的类,只想知道如何启动线程

谢谢


我认为你应该使用Task<T>而不是Thread...并且在那里你应该使用Task.Factory来启动任务 ;) - Random Dev
请阅读 http://tinyurl.com/so-hints 并在下一个问题中更加注意您的示例代码(以及清晰度)。 - Jon Skeet
1个回答

35
你需要先退一步开始,阅读编译器错误信息。Thread不是泛型类型。你试图做什么并不清楚,特别是因为你甚至没有展示一个无参的getStatistics()方法(应该按照.NET命名约定称为GetStatistics()),而你展示的带参数的getStatistics()方法也没有返回类型。
使用lambda表达式启动线程是容易的部分。
Thread thread = new Thread(() => CallSomeMethodHere());
thread.Start();

然而,这并不清楚如何转化到你的示例代码中。

或者在 .NET 4 中使用 TPL,你可以(而且可能应该)使用 TaskTask<T>

Task task = Task.Factory.StartNew(() => CallSomeMethodHere());
或者
Task<string> task = Task.Factory.StartNew(() => CallSomeMethodReturningString());

你可能真正想要的是:

Task<List<string>> statisticsTask = Task.Factory.StartNew(() => {
   Statistics statistics = new Statistics(path);
   return statistics.ipList();
});
注意这里构造函数是在新任务中调用的-这很重要,因为看起来它可能正在做所有的工作。(通常这是一个不好的开始,但这另当别论。)

顺便说一句,你应该查看.NET命名约定……

谢谢,我会尝试这个方法,但是我不能使用Task,因为我正在使用.NET 3.5,并且我的getStatistics()方法只是一个例子。 - user979033

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接