关于异步方法调用

简介:

在我们的程序中,很多时候会有一些耗时较长的运算,我们为了保证用户体验,让用户界面能得到及时的响应。我们一般会采用多线程操作,让耗时操作在
后台完成,比如我们在上传文件或其他一些需求要在界面显示进度条的例子。在 .NET2.0中为我们供了一个BackGroundWorker类可以完成类似的需求,具体
使用我们可以参考MSDN。本文要说的我们自己来完成这样一个功能,并封装在通用的基类当中。

1.我们封装的基类如下:

public abstract class MyAsyncBaseClass
    {        
        //封装业务方法参数
        private class MyMethodParameters
        {
            public string StringParameter { get; set; }
            public int IntParameter { get; set; }
            public object CallerStateObject { get; set; }
            public System.Windows.Threading.Dispatcher CallingDispatcher { get; set; }
        }
        
        //当线程执行完成后被激发的事件
        public event EventHandler<MyAsyncEventArgs> MyMethodComplete;
        protected void FireMyMethodCompleteEvent(int result, object state)
        {
            if (MyMethodComplete != null)
            {
                MyMethodComplete(this, new MyAsyncEventArgs(result, state));
            }
        }

        //业务逻辑程序
        public abstract int MyMethod(string stringParameter, int intParameter);
        
        // 异步调用的方法
        public void MyMethodAsync(string stringParameer, int intParameter, object state)
        {
            //Instantiate the parameter wrapper.
            MyMethodParameters parameters = new MyMethodParameters()
            {
                StringParameter = stringParameer,
                IntParameter = intParameter,
                CallerStateObject = state,
               
                CallingDispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher
            };            
            //创建线程
            System.Threading.ThreadPool.QueueUserWorkItem(MyMethodThreaded, parameters);
        }

        // 线程入口点        
        private void MyMethodThreaded(object p)
        {
            MyMethodParameters parameters = (MyMethodParameters)p;            
            //调用实际的MyMethod方法
            int result = MyMethod(parameters.StringParameter, parameters.IntParameter);
            ///Incorect way to raise event
            ///This would cause a "Cross-thread operation not valid Exception"
            ///FireMyMethodCompleteEvent(result, parameters.CallerStateObject);
            ///
            ///Correct way to raise event
            ///Construct a new delegate with the signature <int, object> and register
            ///it on the caller's event queue.
            parameters.CallingDispatcher.BeginInvoke(
                new Action<int, object>(FireMyMethodCompleteEvent),
                result,
                parameters.CallerStateObject
            );
        }
    }

2.事件参数如下:

public class MyAsyncEventArgs : EventArgs
    {
/// 用户状态对象 public object State { get; protected set; } /// 线程操作完的结果 /// </summary> public int IntResult { get; protected set; } public MyAsyncEventArgs(int result, object state) { State = state; IntResult = result; } }

3.我们具体要实现的类如下:

public class MyClass : MyAsyncBaseClass
    {       
        public override int MyMethod(string stringParameter, int intParameter)
        {           
            System.Threading.Thread.Sleep(2000);
            MessageBox.Show("业务逻辑程序执行的地方");
            return 42;
        }
    }

4.下面我来做下测试,如下:

image

 

public partial class Form1 : Form
    {
       protected MyAsyncBaseClass class1;

        public Form1()
        {
            InitializeComponent();
            class1 = new MyClass();            
            class1.MyMethodComplete += MyClass_MyMethodComplete;
        }
        void MyClass_MyMethodComplete(object sender, MyAsyncEventArgs e)
        {         
            object userState = e.State;
            textBox1.Text = String.Format("耗时计算的结果: {0}", e.IntResult);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            class1.MyMethodAsync("A string parameter", 100, this);
        }

}


本文转自生鱼片博客园博客,原文链接http://www.cnblogs.com/carysun/archive/2009/10/18/AsyncMethodCall.html,如需转载请自行联系原作者

相关文章
|
7月前
|
C语言 C++ 容器
C调用C++代码
C调用C++代码
40 1
同步调用和异步调用
同步调用和异步调用
|
缓存 负载均衡 微服务
多服务间的调用
上文我们把我们项目注册到服务器上了,但是在微服务中,我们会有多个服务,同时也会使用A服务调用B服务的接口。springcloud netflix这里有两种方式ribbon和feign,我们分别介绍。
118 0
多服务间的调用
|
C++
c调用c++函数
c调用c++普通函数     cpp_test/cpp.h #ifndef CPP_H #define CPP_H #include "extern_cpp.h" int add(int a, int b); char add(char a, char b); #endif // CPP_H     cpp_test/extern_cpp.
2025 0
同步调用与异步调用
同步调用与异步调用 一:什么是同步调用与异步调用 定义:1:同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果。2:异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕;而是继续执行下面的流程。
3086 0
|
Java 开发工具 应用服务中间件
|
Java Spring 负载均衡