Асинхронная многопоточность через Task.Factory.FromAsync - C#

Узнай цену своей работы

Формулировка задачи:

Приветствую! Не могу разобраться, как мне перевести пример ниже на асинхронное выполнение методов. согласно справке, в качестве аргументов Task.Factory.FromAsync() должны быть 2 значения. Стартовый метод, и конечный метод. Так вот, как мне это применять, если мне надо запускать только 1н метод ? вот пример из msdn
 
static Task<String> ReturnTaskFromAsyncResult()
{
    IAsyncResult ar = DoSomethingAsynchronously();
    Task<String> t = Task<string>.Factory.FromAsync(ar, _ =>
        {
            return (string)ar.AsyncState;
        });
 
    return t;
}
как понимаю, ключевой момент тут для меня
IAsyncResult ar = DoSomethingAsynchronously();
- формат передаваемой в Task.Factory.FromAsync функции. Собственно, как это правильно применить для моей структуры? вот, как я запускаю таски, и пример метода.
    class Worker
    {
        public static int threadCount { get; set; }
        Task[] tasks;
        public bool IsRunning { get; set; }
 
        //ex data
        public static string exception;
 
        static CancellationTokenSource wtoken = new CancellationTokenSource();
        CancellationToken cancellationToken = wtoken.Token;
        public void doWork(ParameterizedThreadStart method)
        {
            try
            {
                tasks = Enumerable.Range(0, threadCount).Select(i => Task.Factory.FromAsync(() =>
                {
                    while (!cancellationToken.IsCancellationRequested)
                    {
                        IsRunning = true;
                        //if (cancellationToken.IsCancellationRequested)
                        //    return;
                        //cancellationToken.ThrowIfCancellationRequested(); 
                        method(i);
                    }
                }, cancellationToken)).ToArray();
            }
            catch (Exception ex) { exception = ex.Message; }
        }

        public void HardStop()
        {
            try
            {
                using (wtoken)
                {
                    wtoken.Cancel();
                }
                wtoken = new CancellationTokenSource();
                tasks = null;
                IsRunning = false;
            }
            catch (Exception ex) { exception = ex.Message; }
        }
    }
        private void Job(object sender)
        {
 
            Random r = new Random();
 
            log("Thread "+Thread.CurrentThread.ManagedThreadId +" is working...");
            for (int i = 0; i < 5; i++)
            {
                j++;
                log("J==" + j);
                if (j == 50)
                {
                    worker.HardStop();
                    log("STOP");
                }
                
            }
            Thread.Sleep(r.Next(500, 1000));
        }
        private void Start_btn_Click(object sender, EventArgs e)
        {
 
              Worker.threadCount = (int)threadsNum_numeric.Value;
              Worker worker = new Worker();
              worker.doWork(Job);
        }

Решение задачи: «Асинхронная многопоточность через Task.Factory.FromAsync»

textual
Листинг программы
static async void val()
        {
            System.Threading.Tasks.TaskFactory<int> task = new TaskFactory<int>();
            int result = await task.StartNew(() =>
             {
                 System.Threading.Thread.Sleep(1000);
                 //your code
                 return 1;
             });
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5