【问题标题】:Background Worker, C# - Objects sharing between workers - Creating issues后台工作人员,C# - 工作人员之间共享对象 - 创建问题
【发布时间】:2017-03-10 06:42:52
【问题描述】:

我面临一个严重的问题,即一条记录中的数据被复制到另一条记录(覆盖)。我正在使用 MQ 请求使用我的 C# 代码与大型机系统进行通信。我们面临非常随机/罕见的问题,即向大型机发送更新请求以获取该线程先前处理的另一条记录的一条记录复制信息。我正在使用下面的代码后台工作者方法在我的服务器上创建多线程。

我的问题是:一个工作人员创建的对象可以被另一个工作使用吗?那可能吗 ?这可能是覆盖数据的原因之一。

请帮忙推荐一下!!

        BackgroundWorker worker;
        worker = new BackgroundWorker();
        worker.DoWork += new DoWorkEventHandler(DoWork);
        worker.ProgressChanged += new ProgressChangedEventHandler(ProgressChanged);
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunWorkerCompleted);
        worker.WorkerReportsProgress = true;
        worker.RunWorkerAsync();

【问题讨论】:

  • 您当前的代码没有显示您所指的对象?
  • (2) 两个工作线程/线程是否同时调用该对象的方法。我怀疑这一点 - 因为我们每天处理数百万条记录。但是对于 2-3 条记录,我们每周只遇到一次或两次这个问题 - 我如何检查后台进程创建了多少工作人员以及如何限制工作人员使用相同的对象(在这种情况下以及同时调用时)。请帮忙

标签: c# multithreading backgroundworker


【解决方案1】:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        backgroundWorker1.RunWorkerAsync();
    }

    struct SOmeData { }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        SOmeData data = new SOmeData();

        // backgroundWorker1 result
        e.Result = data;
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        // backgroundWorker1 result
        SOmeData data = (SOmeData)e.Result;

        // start backgroundWorker2
        backgroundWorker2.RunWorkerAsync(data);
    }

    private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
    {
        // backgroundWorker1 result
        SOmeData data = (SOmeData)e.Argument;
    }
}

【讨论】:

    猜你喜欢
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    相关资源
    最近更新 更多