PDA

View Full Version : حرفه ای: اجرای همزمان دو task در کنسول سی شارپ



رامین مرادی
پنج شنبه 05 بهمن 1396, 13:01 عصر
سلام وقت بخیر دوستان
یه برنامه دارم که مدام از اینترنت داده میخونه و وقتی اینترنت قطع میشه تو حلقه ای که داره درخواست خوندن میکنه تو حلقه گیر مینه.خطایی هم رخ نمیده فقط گیر میکنه تا داده رو بخونه و وقتی نت وصل میشه دیگه دریافت نمیکنه و تو اون حالت میمونه.
خب منم اومدم یه قطعه کد برای بررسی وجود اینترنت نوشتم و تو شروع برنامه چک میکنه اگه نت نبود برنامه رو ریستارت میکنم. برای اینکه این دوتا تابع بصورت همزمان اجرا بشن من دستورات زیر رو نوشتم تا وقتی نت قطع شد برنامه رو ریستارت کنه.اما بازم وقتی نت قطع میشه تو حلقه گیر میکنه و این بررسی نت اجرا نمیشه. ممنون میشم بگید اشکال کارم کجاست:افسرده:





static void Main(string[] args)
{
MainAsync().Wait();
}


static async Task MainAsync()
{
Task.Run(() => CheckNet());
Task.Run(() => Runwo());
Console.ReadLine();
}
//check internet
public static bool PingTest()
{
System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();

System.Net.NetworkInformation.PingReply pingStatus =
ping.Send(IPAddress.Parse("208.69.34.231"), 1000);

if (pingStatus.Status == System.Net.NetworkInformation.IPStatus.Success)
{
return true;
}
else
{
return false;
}
}



//print net disconnect
public static async Task CheckNet()
{
if (!PingTest())
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("No Internet :(");
Console.WriteLine("the App Restart Ofter 2 Seconds :(");
System.Threading.Thread.Sleep(2000);
ResetMe();

}
}
//restart app
static void ResetMe()
{
var fileName = Assembly.GetExecutingAssembly().Location;
System.Diagnostics.Process.Start(fileName);
Environment.Exit(0);
}
public static async Task Runwo()
{
//get internet data
}

parvizwpf
پنج شنبه 05 بهمن 1396, 16:26 عصر
اینجور برنامه ها باید بره تو دل windows service

mr.sirwan
پنج شنبه 05 بهمن 1396, 17:37 عصر
خب این دستور چک کردن نت فقط یه بار اجرا میشه اونم ابتدای شروع برنامه... شما باید از یه قطعه کد ایونت بیس (event based) یا بر اساس ایونت استفاده کنین که بدون نیاز به چک کردن شما، خودش اتومات با قطع شدن نت، بلافاصله بیاد و برنامه رو ریستارت کنه (من دقیق این راه حل شمارو متوجه نشدم ریستارت کنه که چی بشه؟؟ فرضا نت همچنان قطعه :متفکر:)

رامین مرادی
پنج شنبه 05 بهمن 1396, 19:50 عصر
خب این دستور چک کردن نت فقط یه بار اجرا میشه اونم ابتدای شروع برنامه... شما باید از یه قطعه کد ایونت بیس (event based) یا بر اساس ایونت استفاده کنین که بدون نیاز به چک کردن شما، خودش اتومات با قطع شدن نت، بلافاصله بیاد و برنامه رو ریستارت کنه (من دقیق این راه حل شمارو متوجه نشدم ریستارت کنه که چی بشه؟؟ فرضا نت همچنان قطعه :متفکر:)
خب کاش این راه حل رو بگید چجوری پیاده کنم من بلد نیستم یادم بدید عالی میشه. خب ریستارت هم بخاطر یه منطق خاصه که مشکل ساز نیست. یه مقطع هایی هست که نت لحظه ای قطع میشه تو سرورمون اکثرا هم بخاطر utm مونه که نتونستم علتشو بفهمم گاها هم از طرف ای اس پی هست . وقتی نت قطع میشد تو حلقه ای که داده از نت میخوند گیر میکرد . چون این قطعی لحظه ای هست میخوام ریستارت بشه که به امتمال ۹۰ درصد همون لحظه نت وصل میشه و برنامه از اول اجرا بشه

رامین مرادی
شنبه 07 بهمن 1396, 08:05 صبح
دوستان راه حلی ندارن؟:افسرده:

parvizwpf
شنبه 07 بهمن 1396, 15:20 عصر
با شی تایمر کار کنید عزیز جان این کارها رو برید داخل سرویس و از تایمر ایتفاده کنید کنسول چیز تمیزی نیست.

رامین مرادی
شنبه 07 بهمن 1396, 15:36 عصر
با شی تایمر کار کنید عزیز جان این کارها رو برید داخل سرویس و از تایمر ایتفاده کنید کنسول چیز تمیزی نیست.
از قضا امروز از تایمر استفاده کردم. تایمرشو اشتباه تنضیم کردم nتا کنسول باز شد سرور هنگ کرد :لبخند:
مجبور شدم ریست کنم.:قهقهه:
باید برم رو همون وب سرویس:متفکر:
میشه یک وب سرویس رو با یه برنامه یا وب سرویس دیگه ریستارت کرد؟

parvizwpf
شنبه 07 بهمن 1396, 15:43 عصر
مگه برنامه ات ویندوزی نیست؟
من منظورم ویندوز سرویس هست

رامین مرادی
یک شنبه 08 بهمن 1396, 08:38 صبح
مگه برنامه ات ویندوزی نیست؟
من منظورم ویندوز سرویس هست

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

parvizwpf
یک شنبه 08 بهمن 1396, 08:54 صبح
ربات تلگرام رو با چی نوشتید؟

رامین مرادی
یک شنبه 08 بهمن 1396, 10:11 صبح
ربات تلگرام رو با چی نوشتید؟

با NetTelegramBotAPI نوشتم.
نت قطع بشه تو این کد گیر میکنه. یعنی یه دستور رایت لاین نوشتم که بعد این اجرا میشه که وقتی نت نباشه اجرا نمیشه



var updates = await bot.MakeRequestAsync(new GetUpdates() { Offset = offcet });
Console.WriteLine("Update Count is: {0}", updates.Count());

parvizwpf
یک شنبه 08 بهمن 1396, 10:22 صبح
اون لایبرری معرفه با بهتره که توسط robbin muller نوشته شده خودش اینو هندل کرده . بهر حال شما با catch کردن یک پیام میتونید مجدد توی سیکل یه تایمر این رو بررسی کنید. من باتم رو با ویندوز سرویس نوشته ام

رامین مرادی
یک شنبه 08 بهمن 1396, 10:32 صبح
اون لایبرری معرفه با بهتره که توسط robbin muller نوشته شده خودش اینو هندل کرده . بهر حال شما با catch کردن یک پیام میتونید مجدد توی سیکل یه تایمر این رو بررسی کنید. من باتم رو با ویندوز سرویس نوشته ام

میتونیدراهنمایی و اطلاعات بیشتری رو در این مورد برام بگید یا اینجا یا Ramin.mor47@gmail.com ممنون میشم

mr.sirwan
یک شنبه 08 بهمن 1396, 11:00 صبح
با NetTelegramBotAPI نوشتم.
نت قطع بشه تو این کد گیر میکنه. یعنی یه دستور رایت لاین نوشتم که بعد این اجرا میشه که وقتی نت نباشه اجرا نمیشه



var updates = await bot.MakeRequestAsync(new GetUpdates() { Offset = offcet });
Console.WriteLine("Update Count is: {0}", updates.Count());



مگه داخل حلقه while نیست کداتون؟ خب بصورت دوره ای خودش داره چک میکنه دیگه، یعنی اگه نت به قول شما به صورت لحظه ای قطع بشه حلقه while همچنان به کار خودش ادامه میده، فک نکنم update ی رو هم از دست بده (در این مورد مطمئن نیستم)