【发布时间】: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