اجرای همزمان چند متد و بروزرسانی رابط کاربری
سلام
یک برنامه کوچیک دارم که بایدبه صورت همزمان 11 متد رو اجرا کنه و به هنگام اتمام کار در هر یک از متد ها یک متن رو به متنهایی که در textbox وجود داره اضافه بکنه.
در رویداد کلیک یک باتن این کد رو نوشتم
Parallel.Invoke( () => GetCheapestFlightTehran(),
() => GetCheapestFlightTabriz(),
() => GetCheapestFlightMashhad(),
() => GetCheapestFlightKish(),
() => GetCheapestFlightAhvaz(),
() => GetCheapestFlightIsfahan(),
() => GetCheapestFlightShiraz(),
() => GetCheapestFlightGeshm(),
() => GetCheapestFlightAbadan(),
() => GetCheapestFlightKermanshah(),
() => GetCheapestFlightBandarAbbas()
);
و در هر یک از متدهای فراخوانی شده در بالا برای نشون دادن متن از این کد استفاده کردم
txtResult.Invoke((Action)(() =>
{
txtResult.AppendText(DateTime.Now.ToString("HH:mm: ss") + @" Tehran Count = " + flightsTemp.Count + "\n");
txtResult.AppendText(Environment.NewLine);
}));
حالا چند تا مشکل داریم : یکی اینکه به محظ شروع به کار برنامه کلا نمیشه پنجره برنامه رو تکون داد و مثل موقعی که یک برنامه هنگ میکنه میشه. و مشکل دیگه هم اینه که متن textbox رو به موقع و درست آپدیت نمیکنه یا چند دقیقه بعد آپدیت میکنه یا یک سری متن ها رو نشون نمیده و خلاصه درست نیست.
فکر میکنم در استفاده از parallel یک موردی وجود داره که رعایت نشده . دوستانی که در این مورد تجربه دارن لطفا راهنمای کنن.
با تشکر از همه دوستان
نقل قول: اجرای همزمان چند متد و بروزرسانی رابط کاربری
نقل قول:
نوشته شده توسط
hmahdavi921
سلام
یک برنامه کوچیک دارم که بایدبه صورت همزمان 11 متد رو اجرا کنه و به هنگام اتمام کار در هر یک از متد ها یک متن رو به متنهایی که در textbox وجود داره اضافه بکنه.
در رویداد کلیک یک باتن این کد رو نوشتم
Parallel.Invoke( () => GetCheapestFlightTehran(),
() => GetCheapestFlightTabriz(),
() => GetCheapestFlightMashhad(),
() => GetCheapestFlightKish(),
() => GetCheapestFlightAhvaz(),
() => GetCheapestFlightIsfahan(),
() => GetCheapestFlightShiraz(),
() => GetCheapestFlightGeshm(),
() => GetCheapestFlightAbadan(),
() => GetCheapestFlightKermanshah(),
() => GetCheapestFlightBandarAbbas()
);
و در هر یک از متدهای فراخوانی شده در بالا برای نشون دادن متن از این کد استفاده کردم
txtResult.Invoke((Action)(() =>
{
txtResult.AppendText(DateTime.Now.ToString("HH:mm: ss") + @" Tehran Count = " + flightsTemp.Count + "\n");
txtResult.AppendText(Environment.NewLine);
}));
حالا چند تا مشکل داریم : یکی اینکه به محظ شروع به کار برنامه کلا نمیشه پنجره برنامه رو تکون داد و مثل موقعی که یک برنامه هنگ میکنه میشه. و مشکل دیگه هم اینه که متن textbox رو به موقع و درست آپدیت نمیکنه یا چند دقیقه بعد آپدیت میکنه یا یک سری متن ها رو نشون نمیده و خلاصه درست نیست.
فکر میکنم در استفاده از parallel یک موردی وجود داره که رعایت نشده . دوستانی که در این مورد تجربه دارن لطفا راهنمای کنن.
با تشکر از همه دوستان
سلام پارالل بیشتر برای حلقه for , foreach
https://docs.microsoft.com/en-us/dot...allel-for-loop
شما بهتره از Task ها استفاده کنید به نظرم خیلی بهتره و برنامه هنگ هم نمیکنه
نقل قول: اجرای همزمان چند متد و بروزرسانی رابط کاربری
مشکل اصلی در داخل بدنه توابعی که فراخوانی شده رخ میدهد بخصوص در مورد متغییر flightTemp به احتمال ریاد این متغییر ، یک متغییر عمومی در سطح کلاس هست.وقتی چندین Thread بصورت همزمان درخواست تغییر در یک متغییر اشتراکی را بدهند باعث (deadlock) یا همون هنگ کردن برنامه میشود .برای رفع آن باید روی متغییر flightTepmt یک lock قرار دهی(جهت Thread Safe کردن) تا در هر زمان فقط یک Thread امکان دسترسی به متغییر را داشته باشد .برای اطلاعات بیشتر در مورد Thread Safe کردن متدها و متغییرها جستجو کن.