Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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#_Event Handling - Fatal编程技术网

C#如何用另一个单击事件终止一个单击事件处理程序

C#如何用另一个单击事件终止一个单击事件处理程序,c#,event-handling,C#,Event Handling,我有一个点击事件处理程序,它指向一个形成ssh连接的按钮。我想用另一个“取消”按钮来终止这个函数 但是,在执行事件处理程序时,“取消”单击事件处理程序不会在第一个处理程序执行时运行。我想用“取消”处理程序覆盖第一个处理程序 private void按钮\u sshconnection\u单击(对象发送方,事件参数e) {/*创建ssh连接的一些代码*/} 私有无效按钮\u取消\u单击(对象发送者,事件参数e) {/*终止按钮的一些代码\u sshconnection\u Click*/} 我尝

我有一个点击事件处理程序,它指向一个形成ssh连接的按钮。我想用另一个“取消”按钮来终止这个函数

但是,在执行事件处理程序时,“取消”单击事件处理程序不会在第一个处理程序执行时运行。我想用“取消”处理程序覆盖第一个处理程序

private void按钮\u sshconnection\u单击(对象发送方,事件参数e)
{/*创建ssh连接的一些代码*/}
私有无效按钮\u取消\u单击(对象发送者,事件参数e)
{/*终止按钮的一些代码\u sshconnection\u Click*/}
我尝试了类似上面代码的代码结构,但正如我所说的,第二个函数在第一个函数运行时不运行。如果结构不对,有人能告诉我怎么做这项工作吗

提前感谢,

Onur

您可以尝试实现例程的异步版本,例如

   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();
   }

您正在寻找
任务
(创建ssh连接)和
取消令牌
(取消创建)?@DmitryBychenko我不确定我在寻找什么,我是VisualStudio和c#的新手。我现在正在尝试
Task
CancellationToken
。空检查的好主意。但是为什么只在最后一个块中置零呢?它不应该先处理然后为空吗?我猜当你将它设置为null时,GC会为你处理它,对吗?@vsarunov:
使用
这是
try{…}的语法糖最后{m_Cancellation.dispose()}
将首先处理实例,然后外部
最后
null
分配给
m_Cancellation
啊哈,是的。注意到。这是一个比我的更好的答案。好答案。小挑剔:您应该使用Task.Run,这样您就可以将取消令牌作为第二个参数传递。这可以更好地处理某些边缘情况。@John Wu:谢谢<代码>令牌
值得提取(并跟踪而不是
取消令牌源