C#中,如果希望一个方法能够异步执行,可以创建线程,也可以使用AsyncCallback,后者更简单。
假设有一个方法对给定的两个整数进行复杂运算,会耗费较长时间:
- public void Compute(int x, int y)
- {
- //计算过程省略
- return ......;
- }
先为其定义一个委托:
- public delegate void AsyncComputeCaller(int x, int y);
需要异步调用的时候,执行如下代码:
- AsyncComputeCaller caller = new AsyncComputeCaller(this.Compute);
- AsyncCallback callback = new AsyncCallback(ComputeCallback);
- caller.BeginInvoke(X, Y, callback, caller);
BeginInvoke方法不会阻塞,实现了异步调用。其中ComputeCallback为回调方法,内容如下:
- private void ComputeCallback(IAsyncResult result)
- {
- AsyncComputeCaller caller = (AsyncComputeCaller)result.AsyncState;
- caller.EndInvoke(result);
- }
在此方法中可以做一些后续的处理,由于它可以在UI线程中,因此直接更新界面控件不会有问题。