【问题标题】:How to create multiple threads from an application and do not listen to their response?如何从应用程序创建多个线程并且不听他们的响应?
【发布时间】:2013-07-31 23:07:01
【问题描述】:
我正在尝试执行以下操作:
我有一个服务器,它应该从队列中获取许多消息并处理它们。现在我想要为每条消息创建一个新线程,这些线程将处理对队列的响应,我只希望我的服务器(核心线程)只是监听消息并创建线程,而不关心它们会发生什么.
我怎样才能做到这一点?我知道我可以使用Thread 类来创建一个线程,但是应用程序只会继续监听线程,直到完成为止。
我也可以创建一个async 方法并运行它,但是当它完成时会发生什么?如果我希望它是async,那么该方法也应该是静态的,但在我当前的应用程序中这不是解决方案,因为我在此方法中使用了许多非静态变量。
任何想法都将不胜感激。
【问题讨论】:
标签:
c#
multithreading
asynchronous
【解决方案1】:
除非您有非常具体的原因,否则我建议您使用任务而不是线程。
无论如何,它们很可能会在后台运行,但它们产生的 CPU/内存开销更少,并且(在我看来)在出现异常时更容易处理,...
Task t = Task.Run(() => ProcessMessage(message));
不妨看看this introduction
【解决方案2】:
你是什么意思
我知道我可以使用 Thread 类来创建一个线程,但是应用程序只会继续监听该线程,直到 if 完成。
只需生成线程并让它运行:
{
Thread t = new Thread(Foo);
t.Start();
}
public void Foo()
{ }
这不会让主线程监听子线程,它只是产生它们并继续按照说明工作。
顺便说一句,how to create and run threads 上有大量结果。
【解决方案3】:
由于我不喜欢其他人这样做,这里是每种方式的简单示例(异步/基于任务),您可以选择自己喜欢的方式。
异步实现
int main()
{
while(true)
{
string data = SomeMethodThatReturnsTheNextDataFromQueue();
ProcessDataAsync(data);
}
}
async private void ProcessDataAsync(string msg)
{
// The *await* keyword returns to caller and allows main thread to continue looping.
bool result = await ParseDataAndSaveSomewhere(msg);
return;
}
基于任务的实施
int main()
{
while(true)
{
string data = SomeMethodThatReturnsTheNextDataFromQueue();
Task task = new Task(() => { ProcessData(data) });
task.Start();
}
}
private void ProcessData(string data)
{
// Do work
}