Работа с потоками

#c# #multithreading

#c# #многопоточность

Вопрос:

Я использую стороннюю библиотеку 3d. И у меня есть следующий код:

  Session s = new Session(AuthParam.Login, AuthParam.Password);
 s.Connect();

 s.Connected  = (sender, eventArgs) => 
        {
            _contactCollection = s.ContactList.Contacts.Select(x => new Contact(x.Nickname, x.Uin)).ToList();
        };

        s.ConnectionError  = (sender, eventArgs) =>
        {

        };

 s.Dispose();
  

с.Подключите работу в отдельном потоке. Итак, я хочу остановить выполнение функции. Подождите, пока будут вызваны события, а затем продолжайте выполнение. Как я могу это сделать?

Комментарии:

1. Это непонятно. Так Connect() является ли асинхронным? Я действительно сомневаюсь. Если это так, то немедленно сработает dispose.

Ответ №1:

Почему вы не могли бы изменить порядок своего кода таким образом, чтобы обработчики событий добавлялись перед вызовом Connect ?

 Session s = new Session(AuthParam.Login, AuthParam.Password);

s.Connected  = (sender, eventArgs) => 
  {
    _contactCollection = s.ContactList.Contacts.Select(x => new Contact(x.Nickname, x.Uin)).ToList();
  };

s.ConnectionError  = (sender, eventArgs) =>
  {
  };

s.Connect();
  

Таким образом, вы гарантированно получите инициированные события, вызванные Connect методом, поскольку они подключаются перед Connect вызовом.

На самом деле нет способа предотвратить Connect выполнение после его вызова.1

1Я полагаю, вы могли бы выполнить Connect в отдельном потоке, а затем приостановить этот поток, но это чревато проблемами; их слишком много, чтобы перечислять здесь.