Tag: 委托

使用委托创建垃圾

我正在使用XNA为xbox360开发游戏。 在Xbox上,与PC上的垃圾收集器相比,垃圾收集器的性能相当差,因此将生成的垃圾保持在最低限度对于顺畅执行游戏至关重要。 我记得读过一次调用委托创建垃圾,但现在我的生活中找不到任何对委托创建垃圾的引用。 我是刚刚做到这一点还是代表们搞乱了? 如果代表是凌乱的,建议解决方法的奖励积分。 public delegate T GetValue(T value, T[] args); public static T Transaction(GetValue calculate, ref T value, params T[] args) where T : class { T newValue = calculate(value, args); return foo(newValue); } 我的代码看起来模糊不清,目前,我能想到摆脱委托的唯一解决方案是传入一个inheritance了接口IValueCalculator的类,然后我可以在该接口上调用该方法,这不是很整洁虽然!

代表不仅仅是速记界面吗?

假设我们有: interface Foo { bool Func(int x); } class Bar: Foo { bool Func(int x) { return (x>0); } } class Baz: Foo { bool Func(int x) { return (x<0); } } 现在我们可以将Bar和Baz作为Foos折腾并调用他们的Func方法。 代表们对此进行了简化: delegate bool Foo(int x); bool Bar(int x) { return (x0); } 现在我们可以像Foo代表一样折腾Bar和Baz。 除了获得更短的代码之外,代表们的真正好处是什么?

可以在此通用代码中避免Delegate.DynamicInvoke吗?

这个问题部分是关于代表,部分是关于generics。 鉴于简化的代码: internal sealed class TypeDispatchProcessor { private readonly Dictionary _actionByType = new Dictionary(); public void RegisterProcedure(Action action) { _actionByType[typeof(T)] = action; } public void ProcessItem(object item) { Delegate action; if (_actionByType.TryGetValue(item.GetType(), out action)) { // Can this call to DynamicInvoke be avoided? action.DynamicInvoke(item); } } } 我在其他地方读到,直接调用委托(带括号)比调用DynamicInvoke快DynamicInvoke数量级,这是有道理的。 对于上面的代码示例,我想知道我是否可以执行类型检查并以某种方式提高性能。 一些上下文:我有一个对象流,可以在各种处理程序中进行处理,这些处理程序可以在运行时注册/取消注册。 上面的模式完全符合我的目的,但如果可能的话,我想让它变得更加快捷。 一种选择是将Action存储在Dictionary ,并使用另一个委托包装Action委托。 我还没有比较第二次间接调用会影响的性能变化。

如何在multithreading应用程序中安全地填充数据和Refresh()DataGridView?

我的应用程序有一个DataGridView对象和一个MousePos类型的List。 MousePos是一个自定义类,它包含鼠标X,Y坐标(“Point”类型)和此位置的运行计数。 我有一个线程(System.Timers.Timer)每秒引发一次事件,检查鼠标位置,添加和/或更新此列表上鼠标位置的计数。 我想有一个类似的运行线程(再次,我认为System.Timers.Timer是一个不错的选择),它会再次引发一次事件,每秒自动刷新()DataGridView,以便用户可以看到数据屏幕更新。 (就像TaskManager一样。) 不幸的是,调用DataGridView.Refresh()方法会导致VS2005停止执行,并注意到我遇到了跨线程的情况。 如果我理解正确,我现在有3个主题: 主UI线程 MousePos List线程(Timer) DataGridView刷新线程(计时器) 为了看看我是否可以在主线程上刷新()DataGridView,我在表单中添加了一个名为DataGridView.Refresh()的按钮,但这(奇怪的是)没有做任何事情。 我发现了一个似乎表明如果我设置DataGridView.DataSource = null并返回到我的List的主题,它会刷新datagrid。 确实这有效,但只能通过按钮(在主线程上处理)。 所以这个问题变成了两个问题: 将DataGridView.DataSource设置为null并返回到我的List是一种可接受的刷新数据网格的方法吗? (对我来说似乎效率低下……) 如何在multithreading环境中安全地执行此操作? 这是我到目前为止编写的代码(C#/。Net 2.0) public partial class Form1 : Form { private static List mousePositionList = new List(); private static System.Timers.Timer mouseCheck = new System.Timers.Timer(1000); private static System.Timers.Timer refreshWindow = new System.Timers.Timer(1000); public Form1() { InitializeComponent(); mousePositionList.Add(new […]

使用标准try / catch包装对类的方法的调用

我有一个有大约200多个方法的类,这些方法中的每一个都调用数据库或网络资源。 理想情况下,我想将每个调用包装在try / catch中,以捕获任何常见的网络或SQLexception,并让用户有机会再次尝试(如果适用)。 但是,将此代码添加到每个调用将非常耗时,并且就代码而言是膨胀的。 我已经考虑过在另一个方法中包装每个方法调用,创建一个委托,并将委托代码包装在try / catch中……就像这样…… (忽略语法……这只是一个概念性的例子) bool CallUpdatePassenger(int PassengerId,string PassengerName,string PhoneNumber) { Delegate del= Delegate.CreateDelegate(typeof(UpdatePassengerDelegate), typeof(IPassengerServices).GetMethod(“RemoteUpdatePassenger”)); bool Res=(bool)CallDelegate(del,PassengerName,PhoneNumber); } object CallDelegate(Delegate del,params object[] args) { object Result=null; try { Result=del.DynamicInvoke(args); } catch (Some.Timeout.Error.Or.Whatever te) { // take some action.. maybe retry etc.. } return Result; } 也许还有一种更实用的方法呢? 代码是自动生成的(通过我编写的工具)我可以很容易地包含上面的内容,但我想避免为每个方法调用编写上面的代码。 另外,如果我做了类似上面的事情,我可以计时方法,并记录方法调用等。它看起来有点笨拙(而不是强类型)。 谢谢Rich。

C#中代理问题

在下面的程序中,DummyMethod总是打印5.但是如果我们使用注释代码,我们会得到不同的值(即1,2,3,4)。 任何人都可以解释为什么会这样吗? delegate int Methodx(object obj); static int DummyMethod(int i) { Console.WriteLine(“In DummyMethod method i = ” + i); return i + 10; } static void Main(string[] args) { List methods = new List(); for (int i = 0; i < 5; ++i) { methods.Add(delegate(object obj) { return DummyMethod(i); }); } //methods.Add(delegate(object obj) { return […]

带代表或开关的字典?

我正在编写一个解析器,它调用一些依赖于某些值的函数。 我可以用这样的简单开关实现这个逻辑: switch(some_val) { case 0: func0(); break; case 1: func1(); break; } 或者与代表和这样的字典: delegate void some_delegate(); Dictionary some_dictionary = new Dictionary(); some_dictionary[0] = func0; some_dictionary[1] = func1; some_dictionary[some_value].Invoke(); 这两种方法是否相同,哪种方法更受欢迎?

为什么Java没有方法委托?

Sun的Java gurunaths(nathaनाथ= sanskrit for deity-master-protector)应该屈服于接受代表的必要性并将其草拟为Java规范。 在C#中,我可以将一个方法作为委托作为委托引用,而不需要因为我需要在Java中传递一个方法来创建一个类。 是什么原因导致它不必要(除了引用笨拙地使用一个全新的类用于此目的)或不利于Sun决定不用Java? 匿名创建类或实现接口有哪些优势超过代理? 我什么都想不到,可以吗?

C#中的委托与F#中的第一类值有什么区别?

更具体地说,代表具有作为F#中的第一类值的函数的特征(如果有的话)没有; 作为第一类值的特征有什么特征(如果有的话)在C#中委托没有?

匿名方法与lambda表达式

任何人都可以提供匿名方法和lambda表达式之间的简洁区别吗? 匿名方法的用法: private void DoSomeWork() { if (textBox1.InvokeRequired) { //textBox1.Invoke((Action)(() => textBox1.Text = “test”)); textBox1.Invoke((Action)delegate { textBox1.Text = “test”; }); } } 它只是一个普通的lambda表达式被强制类型化的委托,或者它有更多的秘密。 我很清楚一个强类型的代表就像跟随 UpdateTextDelegate mydelegate = new UpdateTextDelegate(MethodName) 足够作为System.Delegate类型的参数,但匿名方法的想法对我来说相当新。