如何从该线程返回结果
本文关键字:返回 结果 线程 | 更新日期: 2023-09-27 18:20:25
我并不真正理解ThreadStart
的功能。有人能简单解释一下吗?
我想用相同的函数名但不同的调用从ThreadStart
函数返回一个string
。我该怎么做?
这是我的示例代码:
第一次呼叫:
thSystem[index] = new Thread(new ThreadStart(StartProcess()));
第二次呼叫:
StartProcess();
然后
public void StartProcess()
{
//return string
}
您应该考虑使用任务并行库来实现这一点,而不是使用线程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
您应该做的是如下
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;
首先回答您的问题:ThreadStart
只是一个委托。这用于将方法"传递"给线程实例。然后在新线程的上下文中执行该方法。
有两种类型:ThreadStart
用于不带参数的简单方法。如果要将参数传递给线程,则使用ParameterizedThreadStart
。
线程方法不能返回任何值。您通常要做的是定义一个传递给线程的"状态对象",然后线程可以修改其内容(顺便说一句,这也是为线程提供参数的干净方法)。线程完成后,您将得到结果。
我知道有更简单的方法,比如BackgroundWorker
s或Task
s,但你特别要求Thread
s,所以我们开始:
我们需要一个简单的状态对象,它将包含线程的结果:
private class ThreadResult
{
public string Result;
}
现在我们需要您想要在不使用线程的情况下调用的方法:
public string PerformSomething()
{
return "Hello World";
}
现在我们需要线程方法,它将在不同的线程中运行。我们只是让这个方法调用PerformSomething
方法,并将结果存储在state对象中。请注意,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
中派生的线程的上下文中调用的。
您也可以使用一种状态变量并使用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!");
这些代码都没有经过测试,但应该非常接近工作状态
EDIT:固定参数类型和包含类型检查