2013-02-01 36 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