我有一個運行無UI的FTP進程。並有一個使用這個ftp控件的winform。在那個窗口中我有一個顯示ftp上傳進度的進度條。進度通過interfase進入窗口,在underliying主持人更新(我使用MVP模式)。使用線程刷新進度條UI
我的問題是當試圖更新進度時,它總是拋出我這個異常。
通過線程非法操作:控制'prgProgresoSubido'是從一個線程訪問,而不是您創建它的線程。
即使我在表單中使用BackGroundWorker,該問題仍然存在。
// This is a delegated on presenter when a File finish to upload
void client_FileUploadCompletedHandler(object sender, FileUploadCompletedEventArgs e)
{
string log = string.Format("{0} Upload from {1} to {2} is completed. Length: {3}. ",
DateTime.Now, e.LocalFile.FullName, e.ServerPath, e.LocalFile.Length);
archivosSubidos += 1;
_Publicacion.ProgresoSubida = (int)((archivosSubidos/archivosXSubir) * 100);
//this.lstLog.Items.Add(log);
//this.lstLog.SelectedIndex = this.lstLog.Items.Count - 1;
}
// This is My interfase
public interface IPublicacion
{
...
int ProgresoSubida { set; }
}
/// And Here is the implementartion of the interfase on the form
public partial class PublicarForm : Form ,IPublicacion
{
//Credenciales para conectarse al servicio FTP
public FTPClientManager client = null;
public XmlDocument conf = new XmlDocument();
public string workingDir = null;
public webTalk wt = new webTalk();
private readonly PublicacionesWebBL _Publicador;
public PublicarForm()
{
InitializeComponent();
String[] laPath = { System.AppDomain.CurrentDomain.BaseDirectory};
String lcPath = System.IO.Path.Combine(laPath);
_Publicador = new PublicacionesWebBL(this, lcPath);
}
public int ProgresoSubida
{
set
{
// This is my prograss bar, here it throw the exception.
prgProgresoSubido.Value = value;
}
}
}
我該怎麼辦才能避免這個問題?
*「這個問題仍然存在,即使我用一個BackgroundWorker」 * - 你可能不正確地使用BackgroudWorker – GolfWolf 2013-02-22 15:33:49
也許....這是我的第一次用它。也許你有一個簡單的?問題是ftp在它自己的Thread中工作,然後我需要克隆另一個trhead來更新進度條? – 2013-02-22 15:34:47
'BackgroudWorker'應該很簡單:使用ReportProgress方法顯示當前的進度並處理ProgressChanged事件中的UI部分(將在正確的線程中調用)。請參閱http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.progresschanged.aspx – GolfWolf 2013-02-22 15:36:34