如何在页面加载中使用并行

本文关键字:并行 加载 | 更新日期: 2023-09-27 17:57:09

我很少有这样的联系:

try
{
OleDbConnection con1;
using (con1 = new OleDbConnection("Provider=MSDAORA.1;Data Source=db1:1521;Persist Security Info=True;Password=password;User ID=username"))
{
    con1.Open();
    v1 = 1;
    con1.Close();
}
}
catch (Exception ex)
{
v1 = 0;
}
try
{
OleDbConnection con2;
using (con2 = new OleDbConnection("Provider=MSDAORA.1;Data Source=db2:1521;Persist Security Info=True;Password=password;User ID=username"))
{
    con2.Open();
    v2 = 1;
    con2.Close();
}
}
catch (Exception ex)
{
v2 = 0;
}

page_load,按顺序工作。我需要并行运行此连接。我该怎么做?

如何在页面加载中使用并行

使用 C# 6 和 .NET 4.5,您可以将 TPL 与异步一起使用,代码看起来更干净:

static void Main()
{
    var v1Task = Connect();
    var v2Task = Connect();
    var results = Task.WhenAll(v1Task, v2Task);
    var v1 = results.Result[0];
    var v2 = results.Result[1];
}
static async Task<int> Connect()
{
    int v;
    try
    {
        using (var con2 = new OleDbConnection("Provider=MSDAORA.1;Data Source=db2:1521;Persist Security Info=True;Password=password;User ID=username"))
        {
            await con2.OpenAsync();
            v = 1;
            con2.Close();
        }
    }
    catch (Exception)
    {
        v = 0;
    }
    return v;
}

异步启动 con1 和 con2,并等待两个任务完成

var task1 = Task.Run(() =>
{
    try
    {
        using (OleDbConnection con1 = new OleDbConnection("Provider=MSDAORA.1;Data Source=db1:1521;Persist Security Info=True;Password=password;User ID=username"))
        {
            con1.Open();
            v1 = 1;
            con1.Close();
        }
    }
    catch (Exception ex)
    {
        v1 = 0;
    }
});
var task2 = Task.Run(() =>
{
    try
    {
        using (OleDbConnection con2 = new OleDbConnection("Provider=MSDAORA.1;Data Source=db2:1521;Persist Security Info=True;Password=password;User ID=username"))
        {
            con2.Open();
            v2 = 1;
            con2.Close();
        }
    }
    catch (Exception ex)
    {
        v2 = 0;
    }
});
// If you need to wait until task1 and task2 finished, then use this:
List<Task> tasks = new List<Task>();
tasks.Add(task1);
tasks.Add(task2);
Task.WaitAll(tasks.ToArray());

Using parallel.for:

    static void Main(string[] args)
    {
        ConcurrentDictionary<string, int> results = new ConcurrentDictionary<string, int>();
        string[] connStrings = new string[]{"connstring1", "connstring2"};
        Parallel.For(0, connStrings.Length, (i) => {
            results[connStrings[i]] = TryToConnectToDatabase(connStrings[i]);
        });
    }
    static int TryToConnectToDatabase(string connstr)
    {
        try
        {
            OleDbConnection con1;
            using (con1 = new OleDbConnection(connstr))
            {
                con1.Open();
                con1.Close();
                return 1;
            }
        }
        catch (Exception ex)
        {
            return 0;
        }
    }