Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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# 多线程事件处理请求_C#_.net_Multithreading_Winforms_C# 4.0 - Fatal编程技术网

C# 多线程事件处理请求

C# 多线程事件处理请求,c#,.net,multithreading,winforms,c#-4.0,C#,.net,Multithreading,Winforms,C# 4.0,我目前正在开发一个程序,将web应用程序与运行在web服务器上的第三方客户端应用程序连接起来。该应用程序用作web和第三方应用程序之间的连接。每个请求都会进入我的“连接器”应用程序 该应用程序是用C#编写的Windows窗体应用程序(因为第三方应用程序也是…不要问我为什么…),需要一直打开。分解应用程序中的所有内容如下所示: private void Form1_Load(object sender, EventArgs e) {} private void UserE

我目前正在开发一个程序,将web应用程序与运行在web服务器上的第三方客户端应用程序连接起来。该应用程序用作web和第三方应用程序之间的连接。每个请求都会进入我的“连接器”应用程序

该应用程序是用C#编写的Windows窗体应用程序(因为第三方应用程序也是…不要问我为什么…),需要一直打开。分解应用程序中的所有内容如下所示:

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

    private void UserEvent(UserEvent e, long threadID)
    {
        load();
    }
UserEvent()由web触发。触发后,数据将从第三方应用程序中加载,然后“返回”。这些请求最多需要3秒钟。现在,没有问题,因为我是唯一使用此连接的人。为了使其具有多线程性,我现在需要执行load();在另一个线程中,当应用程序仍在为前一个用户加载数据时触发UserEvent

现在我的问题是:你建议我用什么?线程还是后台工作人员? 即使我在另一个线程中执行整个加载,UserEvent()是否仍有可能被两个用户同时触发,从而导致应用程序崩溃


如果
UserEvent(…)
被多次触发,只要该方法不共享或访问对并发访问本身不安全的资源,那么任何建议都没有问题。将内容打包到线程或任务中(您已经看过了吗?)并不能解决有关线程安全的问题

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

private readonly object x = new object();
private void UserEvent(UserEvent e, long threadID)
{
    lock(x) 
    {
       load();
       // ...
    }
}
所以这可能不是你要寻找的。我建议你首先分离出那些可以和那些不能同时运行的部分。然后应用合适的锁定机制来消除并发问题。最后,例如,将东西打包到任务中:

Task.Factory.StartNew(() =>
{
    //..
});
当然你可以做很多微调。但因此需要细节


Edit:我假设您的
UserEvent
可能已经被不同的线程调用了。这就是第一个示例中使用锁的原因。如果情况并非如此,而且您关心的是速度,那么您肯定希望异步执行