我真的不了解ThreadStart
的功能。任何人都可以给出一个简单的解释吗?
我想从string
函数返回一个ThreadStart
,函数名称相同但调用次数不同。我该怎么做?
这是我的示例代码:
第一个电话:
thSystem[index] = new Thread(new ThreadStart(StartProcess()));
第二次电话:
StartProcess();
然后
public void StartProcess()
{
//return string
}
答案 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
。
线程方法不能返回任何值。你通常做的是定义一个传递给线程的“状态对象”,然后可以修改它的内容(顺便说一下,这也是为线程提供参数的简洁方法)。线程完成后,您将获得结果。
我知道有更简单的方法,例如BackgroundWorker
或Task
,但您专门询问了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
中生成的主题的上下文中调用。