【问题标题】:Threaded event handling (C#)线程事件处理 (C#)
【发布时间】:2009-08-24 09:40:31
【问题描述】:

我有一个关于 C# 事件处理的问题。我听 A 类抛出的事件。现在,当事件被抛出时,会执行一个执行某些操作的方法。此方法有时必须等待来自数据源或类似的响应。

我认为事件处理是同步的,所以会处理一个接一个的事件。是否有可能使这个异步?我的意思是当方法执行但必须等待数据源的响应时,可以处理另一个事件?

提前致谢

塞巴斯蒂安

【问题讨论】:

    标签: .net multithreading events event-handling


    【解决方案1】:

    我假设您可以生成需要在新线程中等待的代码。这将导致事件处理程序不会阻塞引发事件的线程,以便它可以调用行中的下一个事件处理程序。 (C# 3.5 示例)

    private void MyPotentiallyLongRunningEventHandler(object sender, SomeEventArgs e)
    {
        ThreadPool.QueueUserWorkItem((state) => {
            // do something that potentially takes time
    
            // do something to update state somewhere with the new data
        });
    }
    

    【讨论】:

    • 如果参数 (SomeEventArgs) 包含任何输出参数怎么办?在计算输出参数之前,该方法不能离开......我在这里发布了一个相关问题:stackoverflow.com/questions/6453655/…
    【解决方案2】:

    很简单,在您的事件处理程序中创建一个线程并在那里执行所有逻辑。最好使用线程池,这样线程数是有限的。

    【讨论】:

    • 创建线程并不便宜,因此对于事件处理程序来说这可能不是一个好主意,但您可以按照您所说的使用线程池。
    • 我不认为线程池总是有预先创建的线程,我认为它会先创建几次,所以无论如何你都会付出代价。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    相关资源
    最近更新 更多