Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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# “异步启动”;上下文“;来自非异步方法-使用ThreadPool.QueueUserWorkItem的非阻塞等待_C#_Multithreading_Async Await_Task - Fatal编程技术网

C# “异步启动”;上下文“;来自非异步方法-使用ThreadPool.QueueUserWorkItem的非阻塞等待

C# “异步启动”;上下文“;来自非异步方法-使用ThreadPool.QueueUserWorkItem的非阻塞等待,c#,multithreading,async-await,task,C#,Multithreading,Async Await,Task,我希望在C#Windows服务内部的非异步上下文中使用异步/等待模式。 我必须使用非异步队列API。 API的communicator类的定义(用于通信)包含一个事件,每当有人通过队列向我的应用程序发送消息时,就会触发该事件。 在我的事件处理程序中,我需要启动一个新线程或使用线程池在另一个线程上处理接收到的消息,以便应用程序仍能同时接收其他消息 通常我会这样做: ThreadPool.QueueUserWorkItem( x => { /* message processing here

我希望在C#Windows服务内部的非异步上下文中使用异步/等待模式。 我必须使用非异步队列API。 API的communicator类的定义(用于通信)包含一个事件,每当有人通过队列向我的应用程序发送消息时,就会触发该事件。 在我的事件处理程序中,我需要启动一个新线程或使用线程池在另一个线程上处理接收到的消息,以便应用程序仍能同时接收其他消息

通常我会这样做:

ThreadPool.QueueUserWorkItem( x => { /* message processing here */ } );
但在本例中,我希望在消息处理中使用异步/等待模式。 我是否需要启动新任务并使用任务的等待方法等待它,或者是否有更好的方法来执行此操作:

ThreadPool.QueueUserWorkItem( x => Task
    .Run( async () =>
    {
      // await async operation here
    } )
    .Wait() );

我仍然在第二项中使用ThreadPool.QueueUserWorkItem,因为消息处理不应该阻塞,所以应用程序在处理过程中仍然可以接收其他消息

你的问题太宽泛了。通常,I/O是异步完成的,并且大多数内置I/O类使用IOCP线程池来处理I/O完成。因此,当收到消息时,您已经处于单独的线程中。我想说的是,您当然不应该仅仅为了调用
Task.Run()
而将工作项排入线程池。那太傻了。在大多数上下文中,默认情况下,
Task.Run()
方法将任务排入线程池。此外,调用
Task.Run()
来执行代码,然后使用
wait
也同样愚蠢。如果您有需要帮助的代码,请将其提取为一个好代码,清楚地显示您正在做什么,并详细描述您遇到的具体问题,以及代码的功能,以及你希望它做什么。@PeterDuniho谢谢你的评论。1) 队列库在库用于获取新消息的同一线程上发布事件。2) 为了处理消息,我想重用一些现有的BLL类,它们都是使用async/await编写的。我可以重写BLL,更改已经使用BLL类的“旧”代码,或者我可以在这个服务中进行“hack”,以便使用BLL类的异步方法。关于这个例子,我可以将我的BLL代码添加到问题中,但我看不出这有助于理解问题。