您的位置:首页 > 其它

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

2011-03-08 00:37 204 查看

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

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

两种写法:

 

 static void Main()

        {

            Func<string, int> 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<string, int> method = Work;

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

// ...

//

}

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

static void Done (IAsyncResult cookie)

{

var target = (Func<string, int>) 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。

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐