繁体   English   中英

线程池线程和监听事件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM