我有文件傳輸應用程序(服務器端)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