首页 > 解决方案 > 使用 Task.Factory 时共享资源

问题描述

这是对connect服务器负责的代码和get一些细节。

public class MigrationManager
{
       private string referenceServerId;

       public void MigrateAnalyzer(string serverid)
       {
            Gw _Gw = new Gw() // library reference
           _Gw.onConnectSucceeded += Handle_OnConnectSucceeded;
           _Gw.onConnectFailed += Handle_OnConnectFailed;

           ConnectToServer(prxHA, serverid);
       }

       private void ConnectToServer(string sid)
       {            
          workstationIDForReference = anayzer;
          string credentials = GWServiceCredentials("somesecret");
           referenceServerId = sid;
         _Gw.connectToServer("SSL", "device1-mydomain.net", credentials, referenceServerId);
       }

     }

此连接操作可能会在两种情况下结束。

这些事件处理如下所示

private void Handle_OnConnectFailed(int hr)
{
      string msg = $"{referenceServerId}";
      Console.WriteLine("Connecting to server {0} is failed", msg); 
}

private void Handle_OnConnectSucceeded()
{
     Console.WriteLine("Connecting to server is success");
}

这很好用。现在我正在更改它以支持多线程。因为有多个请求连接到服务器。

List<string> requestCollection = new List<string>();
requestCollection.Add("I3-1");
requestCollection.Add("I3-2");
requestCollection.Add("I3-3");

var taskList = new List<Task>();

foreach (var serverid in requestCollection )
{
     MigrationManager manager = new MigrationManager();
     var task = Task.Factory.StartNew(() => manager.MigrateAnalyzer(serverid.ToString()));
}

Task.WaitAll(taskList.ToArray());

我在下面看到输出

Console.WriteLine("Connecting to server I3-1 is failed");
Console.WriteLine("Connecting to server I3-2 is failed");
Console.WriteLine("Connecting to server I3-3 is failed");

输出看起来不错!

但是,我认为 COM 将使用共享资源。那么我该如何使用“锁”呢?

标签: c#multithreadingasynchronouseventstask

解决方案


推荐阅读