9

考虑代码:

class Work
{
    public void DoStuff(string s)
    {
        Console.WriteLine(s);
        // .. whatever
    }
}
class Master
{
    private readonly Work work = new Work();

    public void Execute()
    {
        string hello = "hello";

        // (1) is this an ugly hack ?
        var thread1 = new Thread(new ParameterizedThreadStart(o => this.work.DoStuff((string)o)));           
        thread1.Start(hello);
        thread1.Join();

        // (2) is this similar to the one above?
        new Action<string>(s => this.work.DoStuff(s)).BeginInvoke(hello, null, null);
    }
}

(1) 在单独的线程中轻松开始某些工作是一种可接受的方式吗?如果不是更好的选择,将不胜感激。

(2) 做同样的事情吗?我想我要问的是是否启动了一个新线程,或者..

希望你能帮助初学者更好地理解:)

/莫伯格

4

1 回答 1

9

(1) 不是一个丑陋的黑客,但它不是这些天做线程的“方式”。 线程池线程 viaBeginInvoke/EndInvoke和.NET 4.0 中BackgroundWorker任务并行库是要走的路。

(2) 很好,但您需要BeginInvokeEndInvoke某个地方配对。将 new 分配Action<string>给一个变量,然后x.EndInvoke()在主线程或完成方法中手动调用它(第二个参数BeginInvoke)。请参阅此处作为不错的参考。

编辑:以下是(2)应该看起来合理地等同于(1)的方式:

    var thread2 = new Action<string>(this.work.DoStuff);
    var result = thread2.BeginInvoke(hello, null, null);
    thread2.EndInvoke(result);
于 2010-04-22T14:59:24.623 回答