Tag: delegates

如何与许多APM BeginXXX呼叫共享AsyncCallback?

我想用许多APM风格的异步方法重用我的代码。 每种方法都有一个BeginXXX和一个EndXXX签名对。 我想在每个函数中重用相同的回调。 我一直使用下面的匿名方法,但我不知道如何将其提取为可重用的forms。 我知道这应该很简单,但我无法弄清楚如何使用委托来实现这一目标。 (这就是我自学成才) var result = tableSymmetricKeys.BeginExecuteQuerySegmented(query, token, opt, ctx, (o) => { var response = (o.AsyncState as CloudTable).EndExecuteQuerySegmented(o); token = response.ContinuationToken; int recordsRetrieved = response.Results.Count; totalEntitiesRetrieved += recordsRetrieved; Console.WriteLine(“Records retrieved in this attempt = ” + recordsRetrieved + ” | Total records retrieved = ” + totalEntitiesRetrieved); evt.Set(); }, tableSymmetricKeys); 如何使用(o) […]

如何将委托作为参数传递给订阅作为事件处理程序?

我有一个提供事件StkQuit的外部应用程序。 我在静态类中订阅此事件,该类处理我的应用程序和[外部]应用程序之间的所有通信。 我想使用另一个位于我的表单类的处理程序订阅StkQuit事件。 此处理程序将通知用户外部应用程序已关闭。 我想在名为SubscribeToStkQuit的静态类中有一个generics方法,它接受委托作为参数,并将该委托(指我的表单类的处理程序) StkQuit到StkQuit事件。 这可能吗? 这是实现此类function的最优雅/最简单的方法吗? 我的示例代码: 表格类 public delegate void dForceClose(); public void SubscribeToStkQuit(dForceClose forceClose) { UtilStk.SubscribeToStkQuit(forceClose = new dForceClose(ForceClose)); } private void ForceClose() { MessageBox.Show(“TEST”); } 静态类 private static AgUiApplication _stkUiApplication; public static void SubscribeToStkQuit(Delegate subscribeHandler) { _stkUiApplication.OnQuit += subscribeHandler; } [更新] 根据评论,我已更新代码,如下所示: public delegate void dForceClose(object sender, EventArgs e); public […]

使用带有Delegate.CreateDelegate的值类型的C#

使用Jon Skeet的文章使reflection飞行和探索代表作为指导,我试图使用Delegate.CreateDelegate方法将属性复制为委托。 这是一个示例类: public class PropertyGetter { public int Prop1 {get;set;} public string Prop2 {get;set;} public object GetPropValue(string propertyName) { var property = GetType().GetProperty(propertyName).GetGetMethod(); propertyDelegate = (Func)Delegate.CreateDelegate(typeof(Func), this, property); return propertyDelegate(); } } 我遇到的问题是当我调用GetPropValue并传入”Prop1″作为参数时,我在调用Delegate.CreateDelegate时收到ArgumentException ,并显示消息”Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type.” […]

什么是嵌套方法调用和委托之间的区别?

考虑以下: 第一种方法: public void f3() { f2(); f1(); } 还有这个 … 第二种方法: class Sample { public delegate void MyDelegate(string s); MyDelegate obj; public Sample() { obj += new MyDelegate(input); obj+=new MyDelegate(something); obj += new MyDelegate(someStaticMethod); } } 当我调用f3()时,它将调用其中列出的函数…当我将调用委托时会发生同样的情况…所以当我可以使用第一种方法时,是否使用委托来处理某些事件… 方法也封装了方法调用..

可从同一类的另一个实例访问的私有字段

我没有得到以下..我一直以为我只能从声明字段的类访问私有字段。但在这种情况下,我能够访问它: class Session { List ListOfClients = new List(); public void IterateClients(Action action) { } } class client { private int A; Session area; public void SendData() { area.IterateClients(delegate(client c) { cA = 5; //how come this is accessible? }); } }

取消订阅通过ref关键字传递给委托方法的委托?

我有以下课程: public class Terminal : IDisposable { readonly List _listeners; public Terminal(IEnumerable listeners) { _listeners = new List(listeners); } public void Subscribe(ref Action source) { source += Broadcast; //Store the reference somehow? } void Broadcast(string message) { foreach (var listener in _listeners) listener.Listen(message); } public void Dispose() { //Unsubscribe from all the stored sources? } […]

将异步函数存储为变量

我有一个类似于这个问题的问题,但不同之处在于我在处理异步函数。 所以问题说我想在变量中存储一个方法(以后再调用它) 在syncrhonous函数的情况下 private delegate void eventmethod(); //(for a function without arguments and return void) private eventmethod MySavedEvent; void D() { } MySavedEvent = D; MySavedEvent(); 但是如果该function实际上会发生什么 Task D(); 如何在那里定义代理?

C#:在GET / SET属性上为类创建事件

我希望每次我的class级中的一个房产都被设置时发射一个事件。 我希望能够在设置我的某个属性时触发同一事件。 我有(大约12个) 即 public class MyClass { private int _myHeight; private int _myWidth; public int myHeight { get { return myHeight; } set { myHeight = value; //This fires event! } } public int myWidth { get { return myWidth; } set { myWidth = value; //This will fire the same event! } 我不是新事物本身,而是创造事件的新手。 […]

在C#中附加\分离事件处理程序的不同方法之间有什么区别?

我的问题分为两部分 – 首先,我们可以通过以下两种方式附加事件处理程序 – myObject.MyEvent += new EventHandler(MyHandler); myObject.MyEvent += MyHandler; 根据我的理解,这两个是等价的。 在第二种情况下,C#编译器完成从指定方法组的适当重载创建委托实例的工作。 它是否正确? 其次,拆分处理程序的两种相应样式之间有什么区别吗? 如果是,那么它是什么? myObject.MyEvent -= new EventHandler(MyHandler); myObject.MyEvent -= MyHandler;

将事件和委托事件处理程序传递给通用帮助程序方法

我的代码中都有这些。 这是一个WP7 Silverlight应用程序。 UIThreadExecutor.UIThreadExec.Execute(() => buttonControl.Click += new RoutedEventHandler(this.ButtonClickHandler)); 所以,上面的代码,在UI线程上将buttonControl.Click事件分配给事件处理程序ButtonClickHandler ..例如: public void ButtonClickHandler(object sender, System.Windows.RoutedEventArgs e) { } 我想要的是重构: UIThreadExecutor.UIThreadExec.Execute(() => buttonControl.Click += new RoutedEventHandler(this.ButtonClickHandler)); 到一个静态但通用的辅助方法 – 能够指定任何UI控件事件和事件处理程序。 然后该方法将使用UIThreadExecutor类将两者连接在一起。 当然,buttonControl也可以是任何UI控件 – 具有相同类型的不同事件。 例如 – 它可能是带有Checked事件的RadioButton。 如果我在VS 2010中转到RadioButton.Checked或Button.Click的定义它们都是相同的类型: public event RoutedEventHandler Checked; 我一直在摸不着头脑。 我想到了,在我的静态帮助器中 – 声明一个委托(在命名空间级别声明): public delegate void UIControlHandler(object sender, RoutedEventArgs e); 然后我的帮助方法如下所示: public […]