使用异步方式调用同步方法

 BeginInvoke 方法启动异步调用。 该方法与您需要异步执行的方法具有相同的参数,还有另外两个可选参数。 第一个参数是一个 AsyncCallback 委托,该委托引用在异步调用完成时要调用的方法 第二个参数是一个用户定义的对象,该对象将信息传递到回调方法。 BeginInvoke 立即返回,不等待异步调用完成 BeginInvoke 返回一个 IAsyncResult,后者可用于监视异步调用的进度。

EndInvoke 方法检索异步调用的结果。 在调用 BeginInvoke 之后随时可以调用该方法。 如果异步调用尚未完成,则 EndInvoke 会一直阻止调用线程,直到异步调用完成 EndInvoke 的参数包括您需要异步执行的方法的 outref 参数(在 Visual Basic 中为  ByRefByRef)以及由 BeginInvoke 返回的 IAsyncResult

两种写法:

 

 static void Main()

        {

            Func method = Work;

            IAsyncResult cookie = method.BeginInvoke("test", null, null);

            //

            // ... here's where we can do other work in parallel...

            //

            int result = method.EndInvoke(cookie);

            Console.WriteLine("String length is: " + result);

        }

        static int Work(string s) { return s.Length; }

 

第二种写法

 

static void Main()

{

Func method = Work;

method.BeginInvoke ("test", Done, method); //调用的方法名,所要穿的参数值

// ...

//

}

static int Work (string s) { return s.Length; }

static void Done (IAsyncResult cookie)

{

var target = (Func) cookie.AsyncState;//获得method

int result = target.EndInvoke (cookie);//调用EndInvoke.

Console.WriteLine ("String length is: " + result);

}

 

 

 //////////////////////////

异步调用完成时执行回调方法

http://msdn.microsoft.com/zh-cn/library/22t547yb(VS.80).aspx

 

如果启动异步调用的线程不需要是处理结果的线程,则可以在调用完成时执行回调方法。 回调方法在 ThreadPool 线程上执行。

若要使用回调方法,必须将表示回调方法的 AsyncCallback 委托传递给 BeginInvoke 也可以传递包含回调方法要使用的信息的对象。 在回调方法中,可以将 IAsyncResult(回调方法的唯一参数)强制转换为 AsyncResult 对象。 然后,可以使用 AsyncResult.AsyncDelegate 属性获取已用于启动调用的委托,以便可以调用 EndInvoke

 

你可能感兴趣的:(使用异步方式调用同步方法)