c# - 确定两个 BackGroundWorker 字符串是否返回 true

标签 c# multithreading

问题: 检查两个 BackgroundWorkers 是否返回 true 的最佳方法是什么 或者如果两者都没有返回 true,或者只有一个返回 true。

其他信息:

我当前有两个BackgroundWorker 检查是否有两个SQL 连接 有效并根据连接是否成功返回一个值。

代码如下:

private void btnTestSConnection_Click(object sender, EventArgs e)
        {
            BackgroundWorker work1 = new BackgroundWorker { WorkerSupportsCancellation = true };
            BackgroundWorker work2 = new BackgroundWorker { WorkerSupportsCancellation = true };
            work1.RunWorkerCompleted += (item, a) =>
            {
                //need to figure out this portion
            };
            work2.RunWorkerCompleted += (item, a) =>
            {
                //need to figure out this portion
            };

            work1.DoWork += doWork;
            work2.DoWork += doWork;

            SourceString.InitialCatalog = txtSSourceDatabase.Text;
            work1.RunWorkerAsync(SourceString.ConnectionString);
            SourceString.InitialCatalog = txtSSystemDatabase.Text;
            work2.RunWorkerAsync(SourceString.ConnectionString);
        }

DoWorkEventHandler doWork = (sender, e) =>
        {
            SqlConnection Connection;
            BackgroundWorker worker = sender as BackgroundWorker;
            for (int i = 1; (i <= 10); i++)
            {
                    try
                    {
                        using (Connection = new SqlConnection((string)e.Argument))
                        {
                            Connection.Open();
                        }
                        e.Result = true;
                    }
                    catch (SqlException c)
                    {
                        e.Result = false;
                    }
                }
        };

最佳答案

您可以返回一个 KeyValuePair,其中第一个 bool 表示使用了哪个工作线程(work1 为 true,work2 为 false),第二个 bool 是 DoWork 方法的返回值,如下所示:

work1.DoWork += doWork;
work2.DoWork += doWork;

work1.RunWorkerAsync(true);
work2.RunWorkerAsync(false);

private void doWork(s, e)
{
  var kvp = new KeyValuePair<bool, bool>;
  kvp.Key = e.Argument as bool; // this indicate which of the worker returned a value
  ...
  using (Connection = new SqlConnection((string)e.Argument))
  {
    Connection.Open();
  }
  kvp.Value = true; // this is the result of your connection test
  ...
  e.Result = kvp
};

现在,在 RunWorkerCompleted 上,您可以将 Result 转换为 KeyValuePair 并获取 work1 或 work2 是否返回哪个值。

b.RunWorkerCompleted += (item, a) =>
{
  var kvp = a.Result as KeyValuePair<bool, bool>;
  //kvp.Key == true mean this is the work1
  //kvp.Value is the SQL connection test
};

关于c# - 确定两个 BackGroundWorker 字符串是否返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12624046/

相关文章:

c# - 是否有更清晰的语法来将操作应用于序列的每个元素?

c# - 从特定索引中列出 AddRange?

c - 如何提高用 C 编写的阻塞队列的性能?

java - Scala Map 和 ConcurrentHashMap 抛出 java.lang.UnsupportedOperationException

java - 避免 Java Web 应用程序中的乐观锁定

c# - 如何随机化文本文件中的单词

javascript - 传递给initialPreview属性的<img>标签数组

c# - 如何让 Web Api 将 Json.net 序列化字符串对象正确发送回客户端?

linux - Linux中每个进程的最大线程数?

c# - 可升级的readlock的优势?