Общие ресурсы при использовании Task.Factory - PullRequest
0 голосов
/ 28 мая 2019

Вот код, ответственность за который 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 будет использовать общие ресурсы. так как мне использовать "блокировку"?

...