我仍然没有得到代表

Sai*_*han 3 .net vb.net delegates

是不是使用代理来帮助处理一些异步情况?我尝试了以下但我的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
Run Code Online (Sandbox Code Playgroud)

Mat*_*age 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);
Run Code Online (Sandbox Code Playgroud)


Han*_*ant 5

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

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

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

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