如何从此线程返回结果?

时间:2012-01-17 02:56:52

标签: c# multithreading

我真的不了解ThreadStart的功能。任何人都可以给出一个简单的解释吗?

我想从string函数返回一个ThreadStart,函数名称相同但调用次数不同。我该怎么做?

这是我的示例代码:

第一个电话:

thSystem[index] = new Thread(new ThreadStart(StartProcess()));

第二次电话:

StartProcess();

然后

public void StartProcess()
{
    //return string
}

4 个答案:

答案 0 :(得分:1)

您应该考虑使用任务并行库来执行此操作,而不是使用线程API,它将大大简化您的代码。您可以等待任务完成并访问Result属性以在任务完成时检索结果。

static string StartProcess()
{
    // do stuff...
    return "some string";
}

Task<string> myTask = Task.Factory.StartNew<string>(StartProcess);
myTask.Wait(); // wait for it to complete
string result = myTask.Result; // get the result

更好的方法是提供一个在完成时自动执行的延续方法。

static string StartProcess()
{
    // do stuff...
    return "some string";
}

// to be executed when the task completes
static void WhenComplete(Task<string> task)
{
    string result = task.Result;
    // do something with result
}

Task myTask = Task.Factory.StartNew<string>(StartProcess)
    .ContinueWith(WhenComplete);
myTask.Wait(); // wait for everything to complete

答案 1 :(得分:0)

你应该做的事情如下:

public class Work
{
   Work() { };

   string WorkString { get; set; }

   public void DoWork()
   {
     WorkString = setString;
   }

}

var newWork = new Work;
thSystem[index] = new Thread(new ThreadStart(newWork.DoWork()));


newWork.WorkString;

答案 2 :(得分:0)

您还可以使用某种变量并使用ParameterizedThreadStart委托选项来完成此操作:

使用状态类,例如:

public class ThreadState
{
    public string SomeReturnValue { get; set; }
}

并定义您的线程处理方法,如:

public void DoWork(object param)
{
    ThreadState state = param as ThreadState;

    if (state == null)
        throw InvalidCastException(String.Format("Unable to cast type {0} to {1}.", param.GetType().Name, typeof(ThreadState).Name));

    state.SomeReturnValue = "Success";
}

然后您可以使用以下命令调用该线程:

thSystem[index] = new Thread(DoWork);
ThreadState work = new ThreadState();
thSystem[index].Start(work);

然后使用以下命令访问返回的值:

if(work.SomeReturnValue == "Success")
    Console.WriteLine(The thread invocation was successful!");

这些代码都没有经过测试,但应该非常接近工作状态。

编辑:修复了参数类型和包含的类型检查

答案 3 :(得分:0)

首先回答你的问题:ThreadStart只是一个代表。这用于将“传递方法”传递给线程实例。然后在新线程的上下文中执行该方法。

有两种类型:ThreadStart适用于不带参数的简单方法。如果要将参数传递给线程,则使用ParameterizedThreadStart

线程方法不能返回任何值。你通常做的是定义一个传递给线程的“状态对象”,然后可以修改它的内容(顺便说一下,这也是为线程提供参数的简洁方法)。线程完成后,您将获得结果。

我知道有更简单的方法,例如BackgroundWorkerTask,但您专门询问了Thread s,所以我们开始:

我们需要一个简单的状态对象,它将包含线程的结果:

private class ThreadResult
{
    public string Result;
}

现在我们需要你想要在不使用线程的情况下调用的方法:

public string PerformSomething()
{
    return "Hello World";
}

现在我们需要线程方法,它将在不同的线程中运行。我们只是让这个方法调用PerformSomething方法,并将结果存储在状态对象中。请注意,PerformSomething也将在调用线程的上下文中调用 - 因此您必须确保正确处理UI更新并使其成为线程安全的(这超出了本主题):

public string StartProcess(object state)
{
    ThreadResult result = (ThreadResult)state;
    result.Result = PerformSomething();
}

现在我们开始一个新线程并让它做一些事情:

ThreadResult myResult = new ThreadResult();
Thread t = new Thread(ParameterizedThreadStart(StartProcess));
t.Start(myResult);

// Wait for the thread to end
t.Join();

// Evaluate the result
Console.WriteLine(myResult.Result);

因为生成一个线程然后仍然锁定应用程序等待它完成没有多大意义,我们稍微修改一下。假设您正在某种方法中生成线程。然后,线程将完成其工作并在完成时运行另一个方法。然后,您可以异步处理结果。

public void SomeMethodThatStartsTheThread()
{
    ThreadResult myResult = new ThreadResult();
    Thread t = new Thread(new ParameterizedThreadStart(StartProcess));
    t.Start(myResult);

    // We can do other work while the thread is running
}

public string StartProcess(object state)
{
    ThreadResult result = (ThreadResult)state;
    result.Result = PerformSomething();

    ThreadIsDone(result);
}

public void ThreadIsDone(ThreadResult result)
{
    // Do stuff you want to do when the thread is done
}

请注意,ThreadIsDone也会在SomeMethodThatStartsTheThread中生成的主题的上下文中调用。