Асинхронная многопоточность через 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;
});
}