2014-01-15 143 views
0

我目前正在开发一个程序,它将一个Web应用程序与运行在Web服务器上的第三方客户端应用程序相连接。该应用程序正在作为网络和第三方应用程序之间的连接。每一个请求都会进入我的“连接器”应用程序。多线程事件处理请求

该应用程序是一个Windows窗体应用程序(因为第三方应用程序也是一个...不要问我为什么...),并且需要始终打开。打破应用程序的一切看起来像这样:

private void Form1_Load(object sender, EventArgs e) 
    {} 

    private void UserEvent(UserEvent e, long threadID) 
    { 
     load(); 
    } 

UserEvent()被网络触发。触发后,数据将从第三方应用程序加载,然后“返回”。这些请求可能需要3秒钟。现在,没有任何问题,因为我是唯一使用此连接的人。为了使它成为多线程,我现在需要执行load();在另一个线程中,以防在应用程序仍在为非常用户加载数据时触发UserEvent。

现在我的问题:你会建议我使用什么?线程或背景工作者? 即使我在另一个线程中完成整个加载,UserEvent()是否仍然有两个用户在同一时间触发UserEvent()的可能性,导致应用程序崩溃?

任何建议赞赏

回答

0

它没有问题,如果UserEvent(...)是越来越触发多倍的方法不共享或访问是不是并发访问自己的安全ressources。将东西装入线程或任务中(您是否已看过TPL?)并不能解决有关线程安全性的问题。

在最坏的情况下,您的第三方组件不能同时运行多个实例(例如,如果它访问某些常见的后台资源)。但比你的解决方案看起来像:

private readonly object x = new object(); 
private void UserEvent(UserEvent e, long threadID) 
{ 
    lock(x) 
    { 
     load(); 
     // ... 
    } 
} 

所以这可能不是你正在寻找。我建议你首先隔离那些零件,即不能同时运行。然后应用合适的锁定机制来消除并发问题。最后,例如把东西装进一个任务:

Task.Factory.StartNew(() => 
{ 
    //.. 
}); 

当然,你可以微调很多。但是因此需要细节。


编辑:我假设你UserEvent可能已经得到由不同的线程调用。这就是第一个例子中锁的原因。如果情况并非如此,并且速度是您关心的问题,那么您肯定希望异步执行。