Асинхронная многопоточность через Task.Factory.FromAsync - C#
Формулировка задачи:
Приветствую!
Не могу разобраться, как мне перевести пример ниже на асинхронное выполнение методов.
согласно справке, в качестве аргументов Task.Factory.FromAsync() должны быть 2 значения. Стартовый метод, и конечный метод. Так вот, как мне это применять, если мне надо запускать только 1н метод ?
вот пример из msdn
как понимаю, ключевой момент тут для меня -
формат передаваемой в Task.Factory.FromAsync функции.
Собственно, как это правильно применить для моей структуры?
вот, как я запускаю таски, и пример метода.
static Task<String> ReturnTaskFromAsyncResult() { IAsyncResult ar = DoSomethingAsynchronously(); Task<String> t = Task<string>.Factory.FromAsync(ar, _ => { return (string)ar.AsyncState; }); return t; }
IAsyncResult ar = DoSomethingAsynchronously();
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; }); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д