0

我正在尝试执行以下操作:

我有一台服务器,它应该从队列中获取许多消息并处理它们。现在我想要为每条消息创建一个新线程,这些线程将处理对队列的响应,我只希望我的服务器(核心线程)只是监听消息并创建线程,而不关心它们会发生什么.

我怎样才能做到这一点?我知道我可以使用Thread该类来创建一个线程,但是应用程序只会继续侦听该线程,直到完成为止。我也可以创建一个async方法并运行它,但是当它完成时会发生什么?如果我希望它是静态的,那么该方法也应该是静态的,async但在我当前的应用程序中这不是解决方案,因为我在该方法中使用了许多非静态变量。

任何想法,将不胜感激。

4

3 回答 3

2

除非您有非常具体的原因,否则我建议您使用任务而不是线程。无论如何,它们很可能会在后台运行,但它们产生的 CPU/内存开销更少,并且(在我看来)在出现异常时更容易处理,......

Task t = Task.Run(() => ProcessMessage(message));

也许看看这个介绍

于 2013-07-31T14:56:12.270 回答
1

你是什​​么意思

我知道我可以使用 Thread 类来创建一个线程,但是应用程序只是一直在监听线程,直到 if 完成。

只需生成线程并让它运行:

    { 
        Thread t = new Thread(Foo);
        t.Start();
    }

    public void Foo()
    { }

这不会使主线程监听子线程,它只是生成它们并继续按照说明进行操作。

顺便说一句,关于如何创建和运行线程有很多结果。

于 2013-07-31T14:44:53.763 回答
0

由于我不喜欢其他人这样做,因此这里是每种方式的简单示例(异步/基于任务),您可以选择自己喜欢的方式。

异步实现

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
}
于 2013-07-31T15:07:01.917 回答