在for循环中异步调用相同的方法并正确捕获结果

时间:2011-12-21 09:38:15

标签: c# asynchronous

我有一个检查SQL Server是否可用的方法

public static bool IsServerAvailable(string connection)
    {
        bool isAvailable = false;
        try
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                isAvailable = true;
            }
        }
        catch
        {
            isAvailable = false;
        }
        return isAvailable;
    }

现在我必须编写一个接受字符作为连接字符串的字典的方法,并根据从上面的方法返回的结果更新值

但问题是我需要进行异步调用并且能够做到,但是面对更新字典中相应conn(键)值的问题

 public delegate bool CheckConnectionDelegate(string conn);

    public static void CheckCubeAccessibility(Dictionary<ServerName, bool> serverDict)
    {
        string conn;
        //Create the delegate
        CheckConnectionDelegate serverConn = new CheckConnectionDelegate(IsServerAvailable);

        foreach (var server in serverDict)
        {
            switch (server.Key)
            {
                case ServerName.A:
                    conn = "A";
                    break;
                case ServerName.B:
                    conn = "B";
                    break;
                case ServerName.C:
                    conn = "C";
                    break;
            }
            //Call the begin invoke method
            IAsyncResult res = serverConn.BeginInvoke(conn, null, null);

        }

    }

任何人都可以帮助我吗?

解决上述问题的方法是 编写How to get the parameters passed to the asynchronous method in the callback

中提到的lambda表达式

但我需要一个解决方案来延迟函数CheckCubeAccessibility返回,直到返回所有异步调用

怎么做?

1 个答案:

答案 0 :(得分:1)

字典需要在函数之外。

你需要进行异步调用,并为另一个函数提供一个回调方法,然后更新字典。

将此行更改为:

  IAsyncResult res = serverConn.BeginInvoke(conn, new AsyncCallback(CallbackMethod), null);

然后创建函数:

static void CallbackMethod(IAsyncResult ar)
    {

    }

然后在那里进行更新。

阅读本文以获取更多信息:Calling Synchronous Methods Asynchronously