2013-02-01 37 views
1

使用有关从here的lambda运算符的答案,我有一个接受参数并正常工作的线程。不过,我希望能够从线程中获取东西。这是代码的样子:如何从一个带参数的线程返回一个值?

namespace Renamer 
{ 
    class RenameThread 
    { 
     public Thread StartRename(bool commit, ICollection checkeditems, ArrayList rules) 
     { 
      var t = new Thread(() => doRename(commit, checkeditems, rules)); 
      t.Start(); 
      return t; 

     } 
     private void doRename(bool commit, ICollection checkeditems, ArrayList rules) 
     { 
      ArrayList filenames = new ArrayList(); 
      ArrayList newfilenames = new ArrayList(); 
      filenames.AddRange(checkeditems); 
      //do stuff with filenames 
      //I want to be able to return newfilenames (or perhaps some object that contains it) 
     } 
    } 
} 

它从点击一个按钮叫:

private void btnTest_Click(object sender, EventArgs e) 
{ 
    RenameThread rt = new RenameThread(); 
    Thread renameThread = rt.StartRename(false, clbFiles.CheckedItems, rules); 
    renameThread.Join(); 
} 

在Java我只是执行Runnable这样我就可以得到线程的成员直接访问字段,如果我需要它们,但由于我不能从Thread继承,所以我对我应该做什么感到有点不知所措。

+0

'Thread.Join'块直到线程完成。你可以运行你的代码同步... –

回答

2

你会使用Tasks

var renameTask = Task.Factory.StartNew(() => Rename(...)); 

现在,您可以等待任务完成,类似于您Join,通过访问Result

var newFilenames = renameTask.Result; 

或者你能做到这一点异步:

renameTask.ContinueWith(t => Console.WriteLine(t.Result)); 

我的答案假定Rename是一种返回string的方法。

+0

工作正常,谢谢。 – Logan