PDA

View Full Version : سوال: خطا هنگام کار با Background worker , Invoke



Helmod
سه شنبه 08 اردیبهشت 1394, 14:20 عصر
سلام خسته نباشید

کسی دلیل این ارور رو میدونه ؟

من یه فرم دارم که وقتی باز میشه به یه URL وصل میشه و فایلی رو دانلود میکنه،‌حالا وقتی ارتباط حین دانلود قطع میشه یا ایمنرنت قطع میشه این ارور رو میده: لطفاً راهنمایی کنید

Invoke or BeginInvoke cannot be called on a control until the window handle has been created.

130720

behzadkhan
سه شنبه 08 اردیبهشت 1394, 15:02 عصر
با سلام

دوست عزیز

آیا امکان دارد کد اون خطی که باعث می شود تا "یک استثنا رخ دهد" را قرار دهید.

با تشکر

Helmod
سه شنبه 08 اردیبهشت 1394, 15:09 عصر
این کل کد مربوط به این فرمه تووی لاین 100 این خطا رخ میده


namespace ClinicAssistant
{
public partial class frmUpdate : Form
{
public frmUpdate()
{
InitializeComponent();
}

private void backgroundWorkerUpdate_DoWork(object sender, DoWorkEventArgs e)
{



picboxL1.Invoke(new MethodInvoker(delegate { picboxL1.Visible = true; }));



try
{

Ping PING = new Ping();
PingReply PingStatus = PING.Send("google.com");
if (PingStatus.Status == IPStatus.Success)
{

picbox1.Invoke(new MethodInvoker(delegate { picbox1.Image = Image.FromFile(Application.StartupPath + "\\Images\\btns\\1-2.png"); }));
picboxL1.Invoke(new MethodInvoker(delegate { picboxL1.Visible = false; }));
picboxL2.Invoke(new MethodInvoker(delegate { picboxL2.Visible = true; }));





try
{
WebRequest request = HttpWebRequest.Create("http://parvini.epage.ir/modules/files/Admin/stream.php?path=/home/epage/images/parvini/update.rar");
request.Method = "HEAD";

request.Credentials = System.Net.CredentialCache.DefaultCredentials;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{

if (response.StatusCode == HttpStatusCode.OK)
{


picboxL2.Invoke(new MethodInvoker(delegate { picboxL2.Visible = false; }));
picbox2.Invoke(new MethodInvoker(delegate { picbox2.Image = Image.FromFile(Application.StartupPath + "\\Images\\btns\\2-2.png"); }));


picboxL3.Invoke(new MethodInvoker(delegate { picboxL3.Visible = true; }));

picboxDownloadLoading.Invoke(new MethodInvoker(delegate { picboxDownloadLoading.Image = Image.FromFile(Application.StartupPath + "\\Images\\Gif\\LoadingRed.gif"); }));
picboxDownloadLoading.Invoke(new MethodInvoker(delegate { picboxDownloadLoading.Visible = true; }));


WebClient WC = new WebClient();
WC.DownloadFile("http://parvini.epage.ir/modules/files/Admin/stream.php?path=/home/epage/images/parvini/update.rar&mode=download", "C:\\Update.rar");

picbox3.Invoke(new MethodInvoker(delegate { picbox3.Image = Image.FromFile(Application.StartupPath + "\\Images\\btns\\3-2.png"); }));
picboxL3.Invoke(new MethodInvoker(delegate { picboxL3.Visible = false; }));
picboxDownloadLoading.Invoke(new MethodInvoker(delegate { picboxDownloadLoading.Visible = false; }));


}
else
{

}
}
}
catch (WebException ex)
{

HttpWebResponse webResponse = (HttpWebResponse)ex.Response;


if (webResponse.StatusCode == HttpStatusCode.NotFound)
{
MessageBox.Show("برنامه بروز است، نیازی به بروز رسانی نیست", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
lblStatus.Invoke(new MethodInvoker(delegate { picboxDownloadLoading.Enabled = false; }));
}
else
{

MessageBox.Show(ex.Message);
}

}



}


else
{

lblStatus.Invoke(new MethodInvoker(delegate { lblStatus.Text = "خطا در ارتباط با اینترنت"; }));
lblStatus.Invoke(new MethodInvoker(delegate { picboxDownloadLoading.Enabled = false; }));
}
}

catch (Exception)
{
lblStatus.Invoke(new MethodInvoker(delegate { lblStatus.Text = "خطا در ارتباط با اینترنت"; }));
lblStatus.Invoke(new MethodInvoker(delegate { picboxDownloadLoading.Enabled = false; }));

}


}

private void frmUpdate_Load(object sender, EventArgs e)
{
picboxDownloadLoading.Image = Image.FromFile(Application.StartupPath + "\\Images\\Gif\\LoadingRed.gif");
picbox1.Image = Image.FromFile(Application.StartupPath + "\\Images\\btns\\1-1.png");
picbox2.Image = Image.FromFile(Application.StartupPath + "\\Images\\btns\\2-1.png");
picbox3.Image = Image.FromFile(Application.StartupPath + "\\Images\\btns\\3-1.png");
picbox4.Image = Image.FromFile(Application.StartupPath + "\\Images\\btns\\4-1.png");
picboxL1.Image = Image.FromFile(Application.StartupPath + "\\Images\\Gif\\9.gif");
picboxL2.Image = Image.FromFile(Application.StartupPath + "\\Images\\Gif\\9.gif");
picboxL3.Image = Image.FromFile(Application.StartupPath + "\\Images\\Gif\\9.gif");
picboxL4.Image = Image.FromFile(Application.StartupPath + "\\Images\\Gif\\9.gif");
backgroundWorkerUpdate.RunWorkerAsync();
}

behzadkhan
سه شنبه 08 اردیبهشت 1394, 15:33 عصر
با سلام


دوست عزیز

در کد لود فرم:

private void frmUpdate_Load(object sender, EventArgs e)
{
picboxDownloadLoading.Image = Image.FromFile(Application.StartupPath + "\\Images\\Gif\\LoadingRed.gif");
picbox1.Image = Image.FromFile(Application.StartupPath + "\\Images\\btns\\1-1.png");
picbox2.Image = Image.FromFile(Application.StartupPath + "\\Images\\btns\\2-1.png");
picbox3.Image = Image.FromFile(Application.StartupPath + "\\Images\\btns\\3-1.png");
picbox4.Image = Image.FromFile(Application.StartupPath + "\\Images\\btns\\4-1.png");
picboxL1.Image = Image.FromFile(Application.StartupPath + "\\Images\\Gif\\9.gif");
picboxL2.Image = Image.FromFile(Application.StartupPath + "\\Images\\Gif\\9.gif");
picboxL3.Image = Image.FromFile(Application.StartupPath + "\\Images\\Gif\\9.gif");
picboxL4.Image = Image.FromFile(Application.StartupPath + "\\Images\\Gif\\9.gif");
backgroundWorkerUpdate.WorkerSupportsCancellation = true;
backgroundWorkerUpdate.WorkerReportsProgress = true;

backgroundWorkerUpdate.RunWorkerAsync();
}



در catch



catch (Exception)
{
backgroundWorkerUpdate.RunWorkerAsync();
}



و


این را به برنامه اضافه کنید:



private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
lblStatus.Invoke(new MethodInvoker(delegate { lblStatus.Text = "خطا در ارتباط با اینترنت"; }));
lblStatus.Invoke(new MethodInvoker(delegate { picboxDownloadLoading.Enabled = false; }));
}



اما اینکه چرا خطا داده فکر می کنم بخاطر این هست که یک دلاگیت نصفه کاره شده و یک دلاگیت دیگر می خواهد درونش فراخوانی شود.

با تشکر

Helmod
سه شنبه 08 اردیبهشت 1394, 16:03 عصر
با سلام


دوست عزیز

در کد لود فرم:

private void frmUpdate_Load(object sender, EventArgs e)
{
picboxDownloadLoading.Image = Image.FromFile(Application.StartupPath + "\\Images\\Gif\\LoadingRed.gif");
picbox1.Image = Image.FromFile(Application.StartupPath + "\\Images\\btns\\1-1.png");
picbox2.Image = Image.FromFile(Application.StartupPath + "\\Images\\btns\\2-1.png");
picbox3.Image = Image.FromFile(Application.StartupPath + "\\Images\\btns\\3-1.png");
picbox4.Image = Image.FromFile(Application.StartupPath + "\\Images\\btns\\4-1.png");
picboxL1.Image = Image.FromFile(Application.StartupPath + "\\Images\\Gif\\9.gif");
picboxL2.Image = Image.FromFile(Application.StartupPath + "\\Images\\Gif\\9.gif");
picboxL3.Image = Image.FromFile(Application.StartupPath + "\\Images\\Gif\\9.gif");
picboxL4.Image = Image.FromFile(Application.StartupPath + "\\Images\\Gif\\9.gif");
backgroundWorkerUpdate.WorkerSupportsCancellation = true;
backgroundWorkerUpdate.WorkerReportsProgress = true;

backgroundWorkerUpdate.RunWorkerAsync();
}



در catch



catch (Exception)
{
backgroundWorkerUpdate.RunWorkerAsync();
}



و


این را به برنامه اضافه کنید:



private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
lblStatus.Invoke(new MethodInvoker(delegate { lblStatus.Text = "خطا در ارتباط با اینترنت"; }));
lblStatus.Invoke(new MethodInvoker(delegate { picboxDownloadLoading.Enabled = false; }));
}



اما اینکه چرا خطا داده فکر می کنم بخاطر این هست که یک دلاگیت نصفه کاره شده و یک دلاگیت دیگر می خواهد درونش فراخوانی شود.

با تشکر


داداش دمت گرم از پاسخی که دادی ، امتحان کردم این ارور رو میده

130722

behzadkhan
سه شنبه 08 اردیبهشت 1394, 16:22 عصر
با سلام

دوست عزیز

اشتباه از سمت من بود

بجای


backgroundWorkerUpdate.RunWorkerAsync();

از


backgroundWorkerUpdate.CancelAsync();

و

اینو هم قبل از اجرا بک گراند ورکر در فرم لود بنویسید:



backgroundWorkerUpdate.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorkerUpd ate_RunWorkerCompleted);


و در نهایت:

اینو:


private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)


به


private void backgroundWorkerUpdate_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)




تغییر دهید.

امیدوارم مشکلتان حل شود.

با تشکر

Helmod
سه شنبه 08 اردیبهشت 1394, 16:35 عصر
داداش ممنون که وقت گذاشتی ،‌این بار میاد تووی فرمی که وقتی کلیک میکنی این فرم باز میشه این خطا رو میده ، ینی میپره تووی کد این صفحه :

130726

مهرداد صفا
پنج شنبه 10 اردیبهشت 1394, 13:42 عصر
با سلام.
-قبل از استارت backGroundWorker، متود Form.Show رو اجرا کنید تا به واسطه نمایش فرم، هندل کنترل ها ساخته شود.
- قبل از Invoke کردن با خصوصیت Control.IsHandleCreated چک کنید که هندل پنجره ساخته شده باشد.