Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从一个应用程序中创建多个线程而不侦听它们的响应?_C#_Multithreading_Asynchronous - Fatal编程技术网

C# 如何从一个应用程序中创建多个线程而不侦听它们的响应?

C# 如何从一个应用程序中创建多个线程而不侦听它们的响应?,c#,multithreading,asynchronous,C#,Multithreading,Asynchronous,我正在努力做到以下几点: 我有一个服务器,它应该从队列中获取许多消息并进行处理。现在我想要的是为每条消息创建一个新线程,这些线程将处理对队列的响应,我只希望我的服务器(核心线程)只监听消息并创建线程,而不关心它们发生了什么 我怎样才能做到这一点?我知道我可以使用Thread类来创建线程,但是应用程序只会一直侦听线程,直到if完成。 我还可以创建一个async方法并运行它,但是当它完成时会发生什么呢?如果我希望方法是async,那么该方法应该是静态的,但在我当前的应用程序中,这不是一个解决方案,因

我正在努力做到以下几点:

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

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

如果您有任何想法,我们将不胜感激。

这是什么意思

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

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

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

    public void Foo()
    { }
这不会使主线程侦听子线程,它只是生成它们并继续按照以下说明工作

顺便说一句,有很多结果。

你说的是什么意思

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

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

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

    public void Foo()
    { }
这不会使主线程侦听子线程,它只是生成它们并继续按照以下说明工作


顺便说一句,上面有大量的结果。

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

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

也许可以看看

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

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

请看一看

,因为我不喜欢别人这样做,下面是每种方法的简单示例(异步/基于任务),您可以选择您喜欢的方法

异步实现

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
}
基于任务的实施

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
}

因为我不喜欢别人这样做,这里有每种方法的简单示例(异步/基于任务),您可以选择您喜欢的方法

异步实现

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
}
基于任务的实施

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
}