PDA

View Full Version : استفاده ازBackground Worker برای ارسال ایمیل



abdullah20
چهارشنبه 09 آذر 1390, 09:52 صبح
سلام دوستان
من در نرم افزارم امکان ارسال ایمیل را قرار دادم
حالا می خوام هر چقدر که طول می کشه ایمیل ارسال بشه را با Background Worker روی progressBar
نشون بدم

کامبیز اسدزاده
جمعه 29 دی 1391, 23:20 عصر
از دوستان اگه کسی نظری داره در رابطه با این موضوع بده چون برای منم لازمه دقیقا همین مشکل رو دارم.

uniqueboy_ara
شنبه 30 دی 1391, 02:06 صبح
یه نگاه به این بنداز:

http://www.chilkatsoft.com/p/p_306.asp

کامبیز اسدزاده
شنبه 30 دی 1391, 09:01 صبح
یه نگاه به این بنداز:

http://www.chilkatsoft.com/p/p_306.asp

اینرو دیدم ولی سر در نیاوردم فقط یه عکسه !!!

کامبیز اسدزاده
شنبه 30 دی 1391, 13:22 عصر
کسی نیست در این زمینه راهنمایی کنه ؟ چطور مشه درصد تکمیلی مراحل پردازش ایمیل رو دریافت کرد و همچنین از هنگ کردن برنامه جلوگیری کرد !
ایمیل که ارسال میشه برنامه تا به اتمام نرسیدن ارسال ایمیل هنگ میکنه.

amirhosseinab
شنبه 30 دی 1391, 13:34 عصر
در ابتدا باید یادآوری کنم که عمل ارسال ایمیل یک عمل Atomic هست و به طور یکجا اتفاق میافتد. در نتیجه نمیتوانید به صورت منطقی از ابتدا تا انتهای ارسال یک ایمیل را بخش بندی کرده و در Progress bar نمایش دهید. مگر اینکه قصد شما از نمایش Progress bar فقط به زیبایی فرم ارتباط داشته باشد.
ولی در خصوص اینکه ارسال ایمیل باعث قفل شدن فرم نشود، باید این عمل را در یک Thread دیگر انجام دهید و همونطور اشاره کردید Background worker یکی از راههای این عمل است. با توجه به نسخه net framework. شما راههای مختلف دیگری نیز میتوان استفاده کرد. که اگر جزئیات را دقیق تر بیان کنید. بهتر میتوانم راهنمایی کنم.

کامبیز اسدزاده
شنبه 30 دی 1391, 14:13 عصر
در ابتدا باید یادآوری کنم که عمل ارسال ایمیل یک عمل Atomic هست و به طور یکجا اتفاق میافتد. در نتیجه نمیتوانید به صورت منطقی از ابتدا تا انتهای ارسال یک ایمیل را بخش بندی کرده و در Progress bar نمایش دهید. مگر اینکه قصد شما از نمایش Progress bar فقط به زیبایی فرم ارتباط داشته باشد.
ولی در خصوص اینکه ارسال ایمیل باعث قفل شدن فرم نشود، باید این عمل را در یک Thread دیگر انجام دهید و همونطور اشاره کردید Background worker یکی از راههای این عمل است. با توجه به نسخه net framework. شما راههای مختلف دیگری نیز میتوان استفاده کرد. که اگر جزئیات را دقیق تر بیان کنید. بهتر میتوانم راهنمایی کنم.

دوست عزیز من روش های مختلفی رو با Thread و Background worker آزمایش کردم.

من در نظر دارم هنگامی که روی دکمه ارسال کلیک میشه فرم قفل و تو یه لیبلی چیزی نمایش داده بشه که (در حال ارسال لطفا صبر کنید) حالا این عمل رو من انجام میدم ولی هر طور انجامش میدم همینکه رو ارسال کلیک میکنم برنامه تا به پایان رسیدن عمل ارسال هنگ میکنه.

البته روشهای زیادی هست ولی فرم من C# WPF هستش و کامپوننت آماده برای این نوع برنامه نویسی وجود نداره.

با کد ها هرجقدر ور رفتم نتونست مشکلمو حلش کنم.

اگه بتونید مثالی روشی چیزی در این رابطه بگید ممنون میشم.

mze666
شنبه 30 دی 1391, 14:19 عصر
اگه .net 4.5 گار میکنید از Async Await هم میتونید استفاده کنید

کامبیز اسدزاده
دوشنبه 02 بهمن 1391, 20:07 عصر
یه مهندس تو این انجمن به این بزرگی پیدا نمیشه ؟!؟!؟!؟

plus
دوشنبه 02 بهمن 1391, 20:19 عصر
شما کدی که میگین هنگ میکنه رو بگذارین ببینیم مشکل از چیه.

کامبیز اسدزاده
دوشنبه 02 بهمن 1391, 20:42 عصر
این کد خدمت شما ... دقت کنید این کد از موتور++C فراخوانی میشه در #C حالا این خط کد که میبینید کلا عکل ارسال رو به صورت کامل انجام میده.

چجوری اینو در داخل یه Thread یا Background worker بزارم.

البته بگم محیط #C WPF هست.



EMAIL.__send("TITLE", ComboBugtype.Text, "0000-0000-0000-0000", "False", "2333", textRange.Text, "mail.mysite.com", 25, "test@test.com", "123456", "test@test.com", "test@test.com");

Mosafers
دوشنبه 02 بهمن 1391, 21:06 عصر
شما کدی که میگین هنگ میکنه رو بگذارین ببینیم مشکل از چیه.

سلام ببخشید دوستان منم این کد رو زیر دکمه دارم میخوام بعد از کلیک روی دیکمه برنامه هنگ نکنه ؟؟؟

مثلا توی زیر دکمه این چنذ خط برای پینگ هستش :
لطفا اگه کسی میتونه برام توی thread قرارش بده میخوام بدونم به چه شکله...

using System.Net.NetworkInformation;
Ping ping = new Ping();
PingReply pingReply = ping.Send("46.224.0.1");
richTextBox1.Text += pingReply.Address;
richTextBox1.Text += pingReply.RoundtripTime;
richTextBox1.Text += pingReply.Status;

لطفا منم راهنمایی کنید | عذر خواهی میکنم از ایجاد کننده تاپیک به خاطر سوالم در اینجا...

plus
دوشنبه 02 بهمن 1391, 21:18 عصر
شما اول مقادیری که از کنترل ها میخونید رو توی متغیر بریزید (توی کدی که داخل BackgroundWorker اجرا میشه دسترسی مستقیم به UI مشکل ایجاد میکنه) و بعد کد رو در رویداد DoWork مربوط به شی BackgroundWorker قرار بدین و هرجا که لازم دارین اجرا بشه، متد RunWorkerAsync اون رو اجرا کنید.

کامبیز اسدزاده
دوشنبه 02 بهمن 1391, 21:21 عصر
شما اول مقادیری که از کنترل ها میخونید رو توی متغیر بریزید (توی کدی که داخل BackgroundWorker اجرا میشه دسترسی مستقیم به UI مشکل ایجاد میکنه) و بعد کد رو در رویداد DoWork مربوط به شی BackgroundWorker قرار بدین و هرجا که لازم دارین اجرا بشه، متد RunWorkerAsync اون رو اجرا کنید.

راستشو بخواین من اصلا درست حسابی با BackgroundWorkerکار نکردم اگه امکان داره یه مثال ساده بزنید.

دقیقا نمیدونم ترتیب کد نویسی BackgroundWorker چجوری هست!

plus
دوشنبه 02 بهمن 1391, 21:27 عصر
یک BackgroundWorker با اسم backgroundWorker1 در فرم از طریق Toolbox درست کنید در قسمت رویدادها (Events) روی DoWork دابل کلیک کنید تا یک Handler براش بسازه، همین کار رو برای رویداد RunWorkerCompleted انجام بدین.
حالا:

private string bugType;
private string range;

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
MAIL.__send("TITLE", bugType, "0000-0000-0000-0000",
"False", "2333", range, "mail.mysite.com", 25,
"test@test.com", "123456", "test@test.com", "test@test.com");
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Done!");
}

private void button1_Click(object sender, EventArgs e)
{
if (!backgroundWorker1.IsBusy)
{
bugType = ComboBugtype.Text;
range = textRange.Text;
backgroundWorker1.RunWorkerAsync();
}

}

کامبیز اسدزاده
دوشنبه 02 بهمن 1391, 21:36 عصر
خب حالا من این ابزار BackgroundWorker رو ندارم چون پروژم C# WPF هستش :( برای این چه کنم مشکل اصلی اینه !

plus
دوشنبه 02 بهمن 1391, 21:52 عصر
خب حالا من این ابزار BackgroundWorker رو ندارم چون پروژم C# WPF هستش :( برای این چه کنم مشکل اصلی اینه !
شما باید به صورت دستی شی رو بسازی. using System.ComponentModel رو اضافه کنید. در قسمت عمومی کلاس Form/Window یا هرچی که هست D-:، شی رو تعریف کنید:

private readonly BackgroundWorker backgroundWorker1 = new BackgroundWorker();

و توی سازنده، رویداد ها رو تنظیم کنید:

backgroundWorker1 .DoWork += backgroundWorker1_DoWork;
backgroundWorker1 .RunWorkerCompleted += backgroundWorker1 _RunWorkerCompleted;

البته فکر میکنم امکان این باشه که در ToolBox به صورت دستی شی رو به به ToolBox اضافه کرد.

کامبیز اسدزاده
دوشنبه 02 بهمن 1391, 22:09 عصر
شما باید به صورت دستی شی رو بسازی. using System.ComponentModel رو اضافه کنید. در قسمت عمومی کلاس Form/Window یا هرچی که هست D-:، شی رو تعریف کنید:

private readonly BackgroundWorker backgroundWorker1 = new BackgroundWorker();

و توی سازنده، رویداد ها رو تنظیم کنید:

backgroundWorker1 .DoWork += backgroundWorker1_DoWork;
backgroundWorker1 .RunWorkerCompleted += backgroundWorker1 _RunWorkerCompleted;

البته فکر میکنم امکان این باشه که در ToolBox به صورت دستی شی رو به به ToolBox اضافه کرد.

مهندس این زحمتو برام میکشی رو WPF توضیح بدی والا مغذم سوت میکشه ! هنگم منگم کلا ! :(

plus
دوشنبه 02 بهمن 1391, 22:20 عصر
والا چیزهایی که من گفتم تا حد ممکن واضح و ساده گفتم شما کجاش مشکل داری؟

کامبیز اسدزاده
دوشنبه 02 بهمن 1391, 22:26 عصر
والا چیزهایی که من گفتم تا حد ممکن واضح و ساده گفتم شما کجاش مشکل داری؟

من کلا سر تا پا مشکلم !

شما یه زحمت بکش اون VS رو باز کن یه پروژه WPF این کارو منو حل کن با یه مثال ساده والا ۴ روزه رو این مساله کلنجار رفتم رو WPF که دیگه مغذم از کار افتاده ! D: ازبس خستم قدرت فکر کردن برام نمونده برا شما زحمت میدم !!!

plus
دوشنبه 02 بهمن 1391, 22:44 عصر
من کلا سر تا پا مشکلم !

شما یه زحمت بکش اون VS رو باز کن یه پروژه WPF این کارو منو حل کن با یه مثال ساده والا ۴ روزه رو این مساله کلنجار رفتم رو WPF که دیگه مغذم از کار افتاده ! D: ازبس خستم قدرت فکر کردن برام نمونده برا شما زحمت میدم !!!

پروژه خطا میده چون MAIL، ComboBugtype و textRange توش تعریف نشده و باید تعریف کنید.

کامبیز اسدزاده
دوشنبه 02 بهمن 1391, 22:51 عصر
پروژه خطا میده چون MAIL، ComboBugtype و textRange توش تعریف نشده و باید تعریف کنید.

دست گلت درد نکنه تقریبا فهمیدم چی به چیه !
ولی خطای زیر رو میده وقتی کلیک میکنم برای ارسال : The calling thread cannot access this object because a different thread owns it.

plus
دوشنبه 02 بهمن 1391, 22:55 عصر
احتمالا شی MAIL یا شی دیگه ای که در BackgroundWorker (رویداد DoWork) استفاده شده، در یک Thread دیگه ساخته شده و چون Background Worker در یک Thread دیگه اجرا میشه این خطا اتفاق می افته.
اگه امکانش هست شیMAIL رو در DoWork مروبط به BackgroundWorker، بسازین (New کنید).

کامبیز اسدزاده
دوشنبه 02 بهمن 1391, 23:11 عصر
احتمالا شی MAIL یا شی دیگه ای که در BackgroundWorker (رویداد DoWork) استفاده شده، در یک Thread دیگه ساخته شده و چون Background Worker در یک Thread دیگه اجرا میشه این خطا اتفاق می افته.
اگه امکانش هست شیMAIL رو در DoWork مروبط به BackgroundWorker، بسازین (New کنید).

کلی اگه توضیح بدم Mail یک کلاس هست در یک فایل DLL که در ++C نوشته شده.
حالا من فرمتش رو از Static تغییر دادم و کلا یه new ازش گرفتم.

ولی مشکل رفع نشد !

کامبیز اسدزاده
دوشنبه 02 بهمن 1391, 23:15 عصر
آهان ! مشکل در ComboBygType هستش ! اینرو بجاش متن خالی دادم حل شد ! چرا به ComboBox ایراد میگیره ؟