当前位置:  开发笔记 > 编程语言 > 正文

我仍然没有得到代表

如何解决《我仍然没有得到代表》经验,为你挑选了2个好方法。

是不是使用代理来帮助处理一些异步情况?我尝试了以下但我的UI仍然挂起.在地球上你是否使用代表?

       Public Class Form1
    Private Delegate Sub testDelegate()

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
 System.EventArgs) Handles Button1.Click

        Dim d As testDelegate = New testDelegate(AddressOf Add)
        d.Invoke()

    End Sub

    Private Sub Add()
        For i As Integer = 0 To 10000
            TextBox1.Text = i + 1
        Next
    End Sub
End Class

Matthew Sava.. 7

正如Joel所提到的 - BeginInvoke()将异步执行委托 - 如果目标返回数据(使用EndInvoke),您将需要设置Async回调来检索返回值.

以下链接是一篇关于使用Delegates for Async Programming的好文章:http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx

另外(这是在C#中 - 抱歉)你可以使用lambda表达式处理回调:

Action myAction = () => Console.WriteLine("This is an async call!");
myAction.BeginInvoke(asyncResult => Console.WriteLine("Async Done!"), null);


Hans Passant.. 5

这有点讽刺,但每个人最喜欢的答案(使用BeginInvoke)实际上并不正确.委托目标方法将在线程池线程上执行.您不能触摸除创建它们的线程以外的线程上的控件,几乎总是程序的主线程.

如果您在调试器中使用.NET framework 2.0及更高版本进行尝试,则循环将立即以IllegalOperationException终止.要纠正这个问题,您必须使用Control.BeginInvoke().与委托的BeginInvoke()方法完全不同的动物btw.

现在这里具有讽刺意味的是,您的循环现在会将10,000个委托调用请求分派给UI线程.它将花费几秒钟执行它们,而不是开始做任何实际工作.就像调度TextBox的Paint事件一样.或响应任何用户输入.事实上你比以前更糟糕了.

我怀疑这有助于解释代表们.也许你可以选择一个更好的例子,一些不试图更新控件的东西.



1> Matthew Sava..:

正如Joel所提到的 - BeginInvoke()将异步执行委托 - 如果目标返回数据(使用EndInvoke),您将需要设置Async回调来检索返回值.

以下链接是一篇关于使用Delegates for Async Programming的好文章:http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx

另外(这是在C#中 - 抱歉)你可以使用lambda表达式处理回调:

Action myAction = () => Console.WriteLine("This is an async call!");
myAction.BeginInvoke(asyncResult => Console.WriteLine("Async Done!"), null);



2> Hans Passant..:

这有点讽刺,但每个人最喜欢的答案(使用BeginInvoke)实际上并不正确.委托目标方法将在线程池线程上执行.您不能触摸除创建它们的线程以外的线程上的控件,几乎总是程序的主线程.

如果您在调试器中使用.NET framework 2.0及更高版本进行尝试,则循环将立即以IllegalOperationException终止.要纠正这个问题,您必须使用Control.BeginInvoke().与委托的BeginInvoke()方法完全不同的动物btw.

现在这里具有讽刺意味的是,您的循环现在会将10,000个委托调用请求分派给UI线程.它将花费几秒钟执行它们,而不是开始做任何实际工作.就像调度TextBox的Paint事件一样.或响应任何用户输入.事实上你比以前更糟糕了.

我怀疑这有助于解释代表们.也许你可以选择一个更好的例子,一些不试图更新控件的东西.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有