C#是action.BeginInvoke(action.EndInvoke,null)一个好主意?

C#是action.BeginInvoke(action.EndInvoke,null)一个好主意?,第1张

概述如果我想做一些“火和忘记”的一些代码,但还是要确保我的内存被清理(每 Why does asynchronous delegate method require calling EndInvoke?),以下是否会达到这个目标? Action myAction = () => LongRunTime();myAction.BeginInvoke(myAction.EndInvoke,null); 如果我想做一些“火和忘记”的一些代码,但还是要确保我的内存被清理(每 Why does asynchronous delegate method require calling EndInvoke?),以下是否会达到这个目标?
Action myAction = () => LongRunTime();myAction.BeginInvoke(myAction.EndInvoke,null);

我已经环顾四周,但没有看到这种模式在任何地方使用.相反,人们使用annonomoyus方法作为其回调(例如The proper way to end a BeginInvoke?)或者它们定义了一个实际的回调方法.由于我还没有看到别人这样做,所以它让我觉得它不起作用,否则就是一个坏主意.

谢谢!

解决方法 使用方法组转换而不是委托是正确的,EndInvoke仍将在您的Action上被调用.没有别的事情要做,因为这是一场火灾,忘了电话.

不幸的是,由于Action是一个委托,我们不能在BCL的某个类中添加一个断点,所以直接无可辩驳地证明EndInvoke是非常有用的.

该代码将(定期)检查由BeginInvoke返回的IAsyncResult的一些私有字段,这似乎跟踪EndInvoke是否已被调用:

public partial class MainWindow : Window{    private Timer _timer = new Timer(TimerCallback,null,100,100);    private static IAsyncResult _asyncResult;    public MainWindow()    {        InitializeComponent();    }    static voID LongRunTime()    {        Thread.Sleep(1000);    }    voID Window_Loaded(object sender,RoutedEventArgs args)    {        Action myAction = () => LongRunTime();        _asyncResult = myAction.BeginInvoke(myAction.EndInvoke,null);    }    static voID TimerCallback(object obj)    {        if (_asyncResult != null)        {            bool called = ((dynamic)_asyncResult).EndInvokeCalled;            if (called)            {                // Will hit this breakpoint after LongRuntime has completed                DeBUGger.Break();                 _asyncResult = null;            }        }    }}

我已经使用SOS双重检查,没有任何管理的内存泄漏.我也尝试了其他一些证据,但是我认为他们比这更多.

在调查过程中发现的一些有趣的事情:myAction.BeginInvoke调用将使用仪器显示在Profilers上,但myAction.EndInvoke不会显示.

总结

以上是内存溢出为你收集整理的C#是action.BeginInvoke(action.EndInvoke,null)一个好主意?全部内容,希望文章能够帮你解决C#是action.BeginInvoke(action.EndInvoke,null)一个好主意?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1259891.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存