Многопоточное программирование c# [требует правки]

278
24 января 2017, 21:06

задача такая: запускается поток в консоли он ждет ввода данных от пользователя. Как пользователь вводит данные поток закрывается. Одновременно второй поток работает в фоне и если пользователь не вводит никаких данных в течении минуты закрывает первый поток. Можете представить решение программы.

Answer 1

Ради интереса написал так

using System;
using System.Threading;
using System.Timers;
using Timer = System.Timers.Timer;
namespace ConsoleApplication1
{
    class Program
    {
        private static string UserText;
        private static Thread FirstThread;
        private static Thread SecondThread;
        private static Timer Timer;
        static void Main()
        {
            FirstThread = new Thread(GetText);
            SecondThread = new Thread(SessionTimer);
            FirstThread.Start();
            SecondThread.Start();
        }
        private static void GetText()
        {
            UserText = Console.ReadLine();
            Console.WriteLine($"Hello my dear, {UserText}");
            Console.Read();
        }
        private static void SessionTimer()
        {
            Timer = new Timer();
            Timer.Elapsed += OnTimedEvent;
            Timer.Interval = 60000;
            Timer.Enabled = true;
        }
        private static void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            if (!FirstThread.IsAlive && !SecondThread.IsAlive)
            {
                Console.WriteLine("Все потоки закрыты!");
            }
            if (!string.IsNullOrEmpty(UserText))
            {
                return;
            }
            if (FirstThread.ThreadState == ThreadState.AbortRequested)
            {
                return;
            }
            FirstThread.Abort();
            Timer.Stop();
            Console.WriteLine("Поток 2 закрыл поток 1");
        }
    }
}
Answer 2

Есть замечательный метод Task.WaitAny, которому можно задать timeout:

class Program
{
    static void Main(string[] args)
    {
        var readingTask = new Task(() =>
        {
            var data = Console.ReadLine();
        });
        Task.WaitAny(
            new[]
            {
                readingTask
            }, 
            TimeSpan.FromSeconds(60));
    }
}
READ ALSO
Перегрузка оператора < в c#

Перегрузка оператора < в c#

У меня есть такой код:

355
user credentials cannot be used for local connections wmi c#

user credentials cannot be used for local connections wmi c#

Не могу понять в чем проблемаЯ доменный пользователь(не локальный), но задача следующая

423
Как обновить ячейку DataTable

Как обновить ячейку DataTable

Есть DataTable, который представляет из себя таблицу из 2 колонок: ИД и Наименование товараПодскажите, каким образом организовать обновление...

453
Запрос в Linq C#

Запрос в Linq C#

Добрый день !

411