我有文件传输应用程序(服务器端)TCP [.NET 4] 为什么BackgroundWorker的给我(backgroundWorker1_ProgressChanged)异常backgroundworker在ProgressChanged时会出现交叉线程异常?
客户端发送一个包含目标路径(其中文件应保存命令成)和大小的文件到服务器开始接收该文件..所以一旦服务器采用的命令..它会调用:
fileTransfer1.Receive(destPath, fileSize);
这种方法在运行在Form1.cs自己的线程:
private void Job(object o)
{
Socket client = (Socket)o;
NetworkStream stream = new NetworkStream(client);
StreamReader sr = new StreamReader(stream);
string cmd = null;
while ((cmd = sr.ReadLine()) != null)
{
string[] command = cmd.Split('<');
switch (command[0])
{
case "receive":
fileTransfer1.Receive(command[1], Convert.ToInt64(command[2]));
break;
default:
break;
}
}
fileTransfer1(用户控件):
public void Receive(string destPath, long fileSize)
{
List<object> job = new List<object>();
job.Add(destPath);
job.Add(fileSize);
backgroundWorker1.RunWorkerAsync(job);
}
long sum = 0;
long fileSize = 0; //this will equal the size of the file later.
private void ReceiveFile(string destPath, long fileSize)
{
using (fs = new FileStream(destPath, FileMode.Create, FileAccess.Write))
{
try
{
int count = 0;
data = new byte[packetSize];
while (sum < fileSize)
{
count = network.Read(data, 0, packetSize);
fs.Write(data, 0, count);
sum += count;
backgroundWorker1.ReportProgress((int)((sum * 100)/fileSize));
}
}
finally
{
CloseTransfer();
}
}
}
这里的BackgroundWorker的方法:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
List<object> job = (List<object>)e.Argument;
string destPath = (string)job[1];
long fileSize = (long)job[2];
ReceiveFile(destPath, fileSize);
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBarFile.Position = e.ProgressPercentage;
progressBarFile.Text = progressBarFile.Position.ToString() + "%";
/*here*/ labelRemaining.Text = CnvrtUnit(fileSize - sum);
}
我的问题,我得到了一个异常(跨线程操作无效:控制 'labelRemaining'从其创建的线程以外的线程访问。) 引用此行:
labelRemaining.Text = CnvrtUnit(fileSize - sum);
我知道这个异常,我知道我必须使用(委托/调用)的事情..但..我知道backgroundworker意味着这.. ..加..我有相同的代码,但服务器这里发送一个文件给客户端..它并没有给出这个例外..它工作正常,表格显示我的细节,因为它应该是。
那么,为什么我只是当我收到一个文件时得到这个异常?
注意:接收方法工作正常。
哪个表单托管BackgroundWorker?是否有Chrome浏览器或IE显示的“下载进度”弹出窗口? – 2012-03-05 18:56:46
@ChrisShain不接受它在该主表单中的userControl ..它接收文件并显示接收进度。 – 2012-03-05 18:58:05
n/m在这个例外中无关紧要。 – Stephen 2012-03-05 19:03:51