【问题标题】:Instance of an object as BackgroundWorker argument作为 BackgroundWorker 参数的对象实例
【发布时间】:2018-04-24 07:36:41
【问题描述】:

有没有办法将类的实例作为 BackgroundWorker.RunWorkerAsync() 的参数传递?我想这样做是为了能够访问实例的方法,然后使用此数据更新显示当前进度的 ProgressBar。 稍作修改的代码:

public class Player 
{
    public void Open(string file)
    {
        string command = "open \"" + file + "\" type MPEGVideo alias canc";
        mciSendString(command, null,0,0);
    }

    public string Progress ()
    {
        StringBuilder position = new StringBuilder(200);
        string command = "status canc position";
        mciSendString(command, position, 200, 0);
        return position.ToString();
    }

    public void Play()
    {
        string command = "play canc";
       mciSendString(command, null, 0, 0);
    }

}


public partial class Form1 : Form
{
    Player song = new Player();
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if(openFileDialog1.ShowDialog()==DialogResult.OK)
        {
            song.Open(openFileDialog1.FileName);
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        song.Play();
        backgroundWorker1.RunWorkerAsync(song);
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        Player rola = (Player)e.Argument;
        int progress
        int.TryParse(rola.Progress(), out progress);
        Debug.WriteLine(rola.Progress());
        Debug.WriteLine(progress);
        backgroundWorker1.ReportProgress(progress);
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
    }

现在代码控制台的输出是一个空字符串和一个cero,当没有文件播放时也会发生同样的情况,所以我的结论是发生这种情况是因为BackgroundWorker没有获取Player的实例

【问题讨论】:

  • 您正在传递Player 的实例,但随后尝试将其转换为Something。您的代码示例不完整,因此不清楚Something 是什么,没关系为什么您认为可以将Player 转换为Something。但是,如果那是真实的代码,那么您的工作人员很可能会在无效的演员阵容中立即失败,所以当然什么也不会发生。
  • @PeterDuniho 哎呀,对不起。它应该是 Player not Something,我在将代码从我的母语翻译成英语时偶然写了这个,这样我就可以更清楚了。
  • 不要翻译代码,除非你是在 IDE 中做的并且已经编译了。在您的问题中结束的代码应该直接从编译和运行的项目中直接复制/粘贴,并且可以预期给定问题(即,如果您有一个编译器错误您要询问,显然代码不会' t 编译)。

标签: c# visual-studio arguments


【解决方案1】:

有没有办法将类的实例作为 BackgroundWorker.RunWorkerAsync() 的参数传递?

没必要。 backgroundWorker1_DoWorkForm1 的实例方法,因此可以直接访问song 字段。

private void button2_Click(object sender, EventArgs e)
{
    song.Play();
    backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
     var worker = sender as BackgroundWorker;
     // ...do something with song
     // e.g.
     // song.Play();

     worker.ReportProgress (...);
     // ...
}

【讨论】:

  • 你上面写的是真的,但没有回答OP的问题。
  • 提出的一个问题是“有没有办法将类的实例作为参数传递给BackgroundWorker.RunWorkerAsync()?”。一个隐含的问题是“[为什么]现在代码控制台中的输出是一个空字符串和一个cero [原文如此]?”您的答案都不适用
  • @PeterDuniho "The answer can be don’t do that, but it should also include try this instead"。老实说,当他可以直接访问实例时,为什么还要麻烦传递一个实例
  • “不要那样做”绝不是对“为什么会这样?”的回答。您也没有理由相信 OP 仅在这种情况下才需要将实例传递给工作人员;将引用传递给DoWork 处理程序可访问的任何变量所引用的对象 的引用是完全合理和有用的。你不必要地缩小了问题的范围,完全回避了它。如果你真的相信这是一个有效的答案,那么你应该投票结束这个问题,作为 SO 上许多其他问答中任何一个的重复,其中答案是“让它成为一个字段” .
  • 很奇怪,这不起作用。作为另一个测试,我将 Debug.WriteLine(song.Progress()) 添加到 Form 的其他方法中,并且能够获得预期的输出,但如果我在 bw_DoWork 中执行相同操作,它只会打印一个空字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 2018-12-29
  • 2016-04-19
相关资源
最近更新 更多