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

本文关键字:方法 结果 循环 for 异步 调用 | 更新日期: 2023-09-27 18:18:24

我有一个方法检查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);
        }
    }
有谁能帮我吗?

解决上述问题的方法是编写如何在回调

中将参数传递给异步方法中提到的lambda表达式

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

如何做到这一点?

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

Dictionary需要在函数之外。

你需要做Async调用,并有一个回调方法到另一个函数,然后更新字典。

将这一行改为:

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

然后创建函数:

static void CallbackMethod(IAsyncResult ar)
    {
    }

然后在那里更新。

异步调用同步方法