【问题标题】:How to have event unregister itself如何让事件自行注销
【发布时间】:2017-10-25 15:28:14
【问题描述】:

我正在使用 Grpc 取消长时间运行的操作。我已经设置好,当服务器收到“取消”命令时,它会向SyncEnd 任务注册一个任务,以便在长时间运行的操作实际上时返回一个答案取消。

有没有办法让这个事件处理程序在工作完成后自行注销?如果不是,服务器崩溃是因为任务已经完成,或者我需要将事件作为“SyncEnd”事件的最后一个操作取消(我不确定这是一个好主意......我不'真的不想每次触发事件时都必须重新注册事件)

我现在拥有的:

public override Task<CancelConfirm> CancelSync(CancelRequest request, ServerCallContext context)
{
    var tcs = new TaskCompletionSource<CancelConfirm>();
    Program.MyClass.SyncEnd += (sender, eventArgs) =>
    {
        tcs.SetResult(new CancelConfirm { Cancelled = true });
    };
    Program.MyClass.Cancel();
    return tcs.Task;
}

【问题讨论】:

  • += 订阅,-= 取消订阅?
  • @blaze_125 我会在-= 的右边放什么?这难道不会在事件有机会触发之前取消注册吗?
  • 是的,它会取消注册,但您只能在事件完成后运行该行。

标签: c# grpc


【解决方案1】:

使用委托来实现所需的行为。

public override Task<CancelConfirm> CancelSync(CancelRequest request, ServerCallContext context) {
    var tcs = new TaskCompletionSource<CancelConfirm>();
    EventHandler handler = null;
    handler = (sender, eventArgs) =>
    {
        Program.MyClass.SyncEnd -= handler; //unregister itself
        tcs.SetResult(new CancelConfirm { Cancelled = true });
    };
    Program.MyClass.SyncEnd += handler; //
    Program.MyClass.Cancel();
    return tcs.Task;
}

【讨论】:

    【解决方案2】:

    Button的上下文中

    btn2.Click += Btn2_Click;//to register
    btn2.Click -= Btn2_Click;//to unregister
    

    完整的 sn-p 示例。

    using System.Drawing;
    using System.Windows.Forms;
    
    namespace UnregisterEvent_46936409
    {
    
        public partial class Form1 : Form
        {
            Button btn1 = new Button();
            TextBox txtbx = new TextBox();
            public Form1()
            {
                InitializeComponent();
                btn1.Location = new Point(5,5);
                txtbx.Location = new Point(5, btn1.Location.Y + btn1.Height + 2);
                this.Controls.Add(btn1);
                this.Controls.Add(txtbx);
                btn1.Click += (sender2, context2) => DoSomethingCool("put me in there", "yahoo");//subscribe to event handler
            }
    
            private void DoSomethingCool(string incoming1, string incoming2)
            {
                txtbx.Text = incoming1 + incoming2;
                btn1.Click -= (Sender2, context2) => DoSomethingCool("shouldnt do anything","blah blah");//unsubscribe from the event
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-03-31
      • 2017-08-26
      • 2018-11-12
      • 1970-01-01
      • 2012-05-21
      • 2020-11-02
      • 2013-02-13
      • 2021-06-12
      • 2017-12-30
      相关资源
      最近更新 更多