[英]Thread pool thread & listening for event
我有一个已订阅事件的线程池线程,并且该事件处理程序在另一个线程上触发。 我的问题是-只要活动订阅处于活动状态,线程池线程何时会返回到池中?或者它会持续存在?
例如:
public class RunTasks
{
private readonly MyTask _myTask;
public RunTasks(MyTask myTask)
{
_myTask = myTask;
}
public void Execute()
{
ThreadPool.QueueUserWorkItem((ignore) => _myTask.Execute());
}
}
public class MyTask
{
private readonly IThridPartyApi _dependency;
public MyTask(IThridPartyApi dependency)
{
_dependency = dependency;
}
public void Execute()
{
_dependency.UpdateEvent -= Handler;
_dependency.UpdateEvent += Handler;
}
private void Handler(object sender, EventArgs e)
{
//raised on another thread as it's coming from a thrid party library.
}
}
public interface IThridPartyApi
{
event EventHandler<EventArgs> UpdateEvent;
}
在上面的示例中,我们说RunTasks.Execute方法被多次调用(范围为100),事件处理程序被触发其中的50个,并在接下来的50个事件中被延迟-多少个活动线程将在监听事件订阅? 我的应用程序中有这种情况,因此正在尝试确保不会从该实现中创建怪物。 请您帮我一个答案和一个原因? 另外,如果这不是有效的实现,我该如何修改它(不使用异步,因为我们仍然不存在)? 请注意,UI按钮处理程序将触发Execute方法。
谢谢,-迈克
现在代码的样子,ThreadPool线程仅用于重置事件处理程序,然后将其释放回池中。 事件处理程序将在引发UpdateEvent事件的线程(即第三方API的线程)中运行。
为了避免这种情况,您可以使用TaskCompletionSource将事件转换为Task。 这在TPL和传统的.NET Framework异步编程中的“ Exposing Complex EAP operations as Tasks
”一节中Exposing Complex EAP operations as Tasks
。 这样,事件处理程序将在ThreadPool线程中异步运行,并且不会阻止第三方线程等待它。
在您的情况下,您可以创建类似以下的函数以返回执行retur的任务:
public static Task<object> OnUpdateAsync(this IThridPartyApi dependency)
{
var tcs=new TaskCompletionSource<object>();
EventHandler handler=null;
handler=(obj,args)=>
{
dependency.UpdateEvent-=handler;
//extract the response here
tcs.SetResult(response);
}
dependency.UpdateEvent+=handler;
return tcs.Task;
}
您可以将返回类型从object
更改为希望从第三方API接收的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.