0

我正在我的应用程序中实现 Perforce API。对于几个长流程,我正在尝试实现 backgroudworker。我之前做过很多次的实现,我知道BGW的来龙去脉,但这次我只是无法得到结果。

public P4()
        {
            bw.WorkerReportsProgress = true;
            bw.WorkerSupportsCancellation = true;
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);

        }

private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;            

            Recordset = p4.Run(p4command, p4args);
        }

P4 是我初始化 BGW 的构造函数。我通常通过 RunWorkerAsync() 方法调用它。bw_DoWork 假设运行 p4.Run() 但我的 Recordset 为空(意味着命令未运行)。关于 p4command,它是一个包含命令的全局字符串,例如“integrate”,而 p4args 是一个包含命令参数的全局数组,两者都是从基本函数初始化的。

知道我缺少什么吗?(我也有 bw_RunWorkerCompleted() 在 bw_DoWork 跳过 p4.run 后完美运行)

谢谢

编辑: 与 BGW 相关的所有功能都在一个单独的类 P4 中,它与任何 GUI 操作无关。我从一个 GUI 调用 P4.integrate() ,它又调用 BGW。当我将 P4.run() 直接放入 P4.integrate() 时,我会在 Recordset 中得到结果,但是将相同的命令放入 bw_DoWork() 似乎不起作用。

异步调用在 P4 类中,在 P4.integrate() 中。

谢谢

4

1 回答 1

0

你能让它在后台工作人员之外的 GUI 线程上工作吗?如果是这样...

正在使用的命令、引用是否位于 GUI 线程上?即使一个是reading信息,跨线程访问仍然是一个考虑因素。我在使用后台工作程序时遇到了 linq 问题失败C# WPF: Linq Fails in BackgroundWorker DoWork Event ,这看起来很相似。

更新

你的 run worker 异步调用在哪里?

于 2014-07-24T14:39:54.277 回答