Nano Hash - криптовалюты, майнинг, программирование

C# Как завершить обработчик события щелчка другим событием щелчка

У меня есть обработчик события click для кнопки, которая формирует ssh-соединение. Я хочу завершить эту функцию еще одним нажатием кнопки «Отмена».

Однако при выполнении обработчика событий обработчик события щелчка «отмена» не запускается во время выполнения первого обработчика. Я хочу переопределить первый обработчик с обработчиком «отмена».

private void button_sshconnection_Click(object sender, EventArgs e)
        { /* some code to create ssh connection */ }

private void button_cancel_Click(object sender, EventArgs e)
        { /* some code to terminate button_sshconnection_Click */ }

Я попробовал структуру кода, подобную приведенному выше коду, но, как я уже сказал, вторая функция не запускается, пока работает первая функция. Если структура неверна, может кто-нибудь сказать мне, как выполнить эту работу.

Заранее спасибо,

Онур

30.05.2019

  • Вы ищете Task (для создания ssh-соединения) и CancellationToken (для отмены создания)? 30.05.2019
  • @DmitryBychenko Я не уверен, что ищу, я новичок в VisualStudio и C#. Сейчас пробую Task и CancellationToken. 30.05.2019

Ответы:


1

Вы можете попробовать реализовать асинхронную версию вашей подпрограммы, например.

   private CancellationTokenSource m_Cancellation;

   private async void button_sshconnection_Click(object sender, EventArgs e) {
     // if method is executing, do nothing. Alternative: cancel and start again   
     if (m_Cancellation != null)
       return;

     try { 
       using (m_Cancellation = new CancellationTokenSource()) {
         var token = m_Cancellation.Token;

         await Task.Run(() => {
           //TODO: implement your logic here, please, note that cancellation is cooperative
           // that's why you should check token.IsCancellationRequested

         }, token);
       }
     }
     finally {
       m_Cancellation = null;  
     }
   }

   private void button_cancel_Click(object sender, EventArgs e) {
     // If we can cancel, do it
     m_Cancellation?.Cancel();
   }
30.05.2019
  • Хорошая идея с нулевой проверкой. Но почему вы обнуляете его только в последнем блоке? Разве это не должно быть сначала Dispose, а затем null? Я предполагаю, что когда вы обнулите его, GC избавится от него за вас, это правильно? 30.05.2019
  • @vsarunov: using, который является синтаксическим сахаром для try {...} finally{m_Cancellation.Dispose()}, сначала удалит экземпляр, а затем внешний finally назначит null m_Cancellation 30.05.2019
  • ага, да. Обратил внимание. Это лучший ответ, чем мой. 30.05.2019
  • Хороший ответ. Небольшой нюанс: вам следует использовать этот прототип Task.Run, поэтому вы можете передать токен отмены в качестве второго параметра. Это лучше обрабатывает определенные крайние случаи. 30.05.2019
  • @Джон Ву: спасибо! token стоит извлечь (и отследить вместо CancellationTokenSource) 30.05.2019
  • Спасибо @DmitryBychenko за ответ. Общая структура - это то, что я ищу. Однако, пока функция работает, она не прекращается, когда я нажимаю кнопку отмены. Он работает, пока не закончит себя. 30.05.2019
  • @Onur: отмена является совместной: вы должны проверить token.IsCancellationRequested и return, break и т. д. выполнение вашей процедуры вручную: if (token.IsCancellationRequested) return; 30.05.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..