是不是使用代理来帮助处理一些异步情况?我尝试了以下但我的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事件一样.或响应任何用户输入.事实上你比以前更糟糕了.
我怀疑这有助于解释代表们.也许你可以选择一个更好的例子,一些不试图更新控件的东西.
正如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);
这有点讽刺,但每个人最喜欢的答案(使用BeginInvoke)实际上并不正确.委托目标方法将在线程池线程上执行.您不能触摸除创建它们的线程以外的线程上的控件,几乎总是程序的主线程.
如果您在调试器中使用.NET framework 2.0及更高版本进行尝试,则循环将立即以IllegalOperationException终止.要纠正这个问题,您必须使用Control.BeginInvoke().与委托的BeginInvoke()方法完全不同的动物btw.
现在这里具有讽刺意味的是,您的循环现在会将10,000个委托调用请求分派给UI线程.它将花费几秒钟执行它们,而不是开始做任何实际工作.就像调度TextBox的Paint事件一样.或响应任何用户输入.事实上你比以前更糟糕了.
我怀疑这有助于解释代表们.也许你可以选择一个更好的例子,一些不试图更新控件的东西.