PDA

View Full Version : حرفه ای: اجرای همزمان چند متد و بروزرسانی رابط کاربری



hmahdavi921
دوشنبه 22 آبان 1396, 15:30 عصر
سلام
یک برنامه کوچیک دارم که بایدبه صورت همزمان 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 یک موردی وجود داره که رعایت نشده . دوستانی که در این مورد تجربه دارن لطفا راهنمای کنن.
با تشکر از همه دوستان

barnamenevisjavan
سه شنبه 23 آبان 1396, 19:51 عصر
سلام
یک برنامه کوچیک دارم که بایدبه صورت همزمان 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/dotnet/standard/parallel-programming/how-to-write-a-simple-parallel-for-loop
شما بهتره از Task ها استفاده کنید به نظرم خیلی بهتره و برنامه هنگ هم نمیکنه

ژیار رحیمی
سه شنبه 23 آبان 1396, 21:39 عصر
مشکل اصلی در داخل بدنه توابعی که فراخوانی شده رخ میدهد بخصوص در مورد متغییر flightTemp به احتمال ریاد این متغییر ، یک متغییر عمومی در سطح کلاس هست.وقتی چندین Thread بصورت همزمان درخواست تغییر در یک متغییر اشتراکی را بدهند باعث (deadlock) یا همون هنگ کردن برنامه میشود .برای رفع آن باید روی متغییر flightTepmt یک lock قرار دهی(جهت Thread Safe کردن) تا در هر زمان فقط یک Thread امکان دسترسی به متغییر را داشته باشد .برای اطلاعات بیشتر در مورد Thread Safe کردن متدها و متغییرها جستجو کن.