如何从带有参数的线程返回值?

时间:2013-02-01 11:23:55

标签: c# multithreading

使用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我在关于我应该做些什么,我有点失落。

1 个答案:

答案 0 :(得分:2)

您可以使用Tasks

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

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

var newFilenames = renameTask.Result;

或者你可以这样做:

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

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