Я немного не понял, вам надо запускать задачи последовательно или параллельно? А если параллельно - то обрабатывать результаты сразу или вместе?
1. Последовательный запуск:
private async void OnlyLike()
{
for (var i=0; i<5; i++)
TextBox.Text += await VK.NakrytkaLike(KeyAntigateTextBox.Text);
}
2. Параллельный запуск, обработка всех результатов вместе
private async void OnlyLike()
{
var tasks = Enumerable.Range(0, 5).Select(i => VK.NakrytkaLike(KeyAntigateTextBox.Text));
foreach (var result in await Task.WhenAll(tasks))
TextBox.Text += result;
}
3. Параллельный запуск, обработка результатов сразу же:
private async void OnlyLike()
{
TextBox.Text += await VK.NakrytkaLike(KeyAntigateTextBox.Text);
}
private void StartButton_Click(object sender, RoutedEventArgs e)
{
for (var i=0; i<5; i++)
OnlyLike();
}
Выбирайте что нравится. И не бойтесь использовать async/await - оно создано для упрощения кода, а не для усложнения :)
UPD
Последовательный запуск на фреймворке 4.0:
public void OnlyLike()
{
var scheduler = TaskScheduler.Current ?? TaskScheduler.FromCurrentSynchronizationContext();
Task task = TaskEx.FromResult(false);
var text = KeyAntigateTextBox.Text;
for (var i=0; i<5; i++) {
task = task.ContinueWith(_ => {
var LikeTurbo = VK.NakrytkaLike(text);
LikeTurbo.ContinueWith(_ => {
TextBox.Text += LikeTurbo.Result;
}, scheduler);
return LikeTurbo;
}, TaskContinuationOptions.ExecuteSynchronously).Unwrap();
}
}
...
public static class TaskEx {
public static Task<T> FromResult<T> (T result) {
var tcs = new TaskCompletionSource<T>();
tcs.SetResult(result);
return tcs.Task;
}
public static Task<T> Unwrap<T>(this Task<Task<T>> task) {
var tcs = new TaskCompletionSource<T>();
task.ContinueWith(_ => {
if (task.IsCanceled) tcs.SetCancelled();
else if (task.IsFaulted) tcs.SetException(task.Exception);
else task.Result.ContinueWith(innerTask => {
if (innerTask.IsCanceled) tcs.SetCancelled();
else if (innerTask.IsFaulted) tcs.SetException(task.Exception);
else tcs.SetResult(innerTask.Result);
}, TaskContinuationOptions.ExecuteSynchronously);
}, TaskContinuationOptions.ExecuteSynchronously);
return tcs.Task;
}
}
Выглядит многословно, но на самом деле - ничего сложного. В цикле задачи ставятся в очередь одна за другой при помощи конструкции task = task.ContinueWith(...).Unwrap(). Здесь Unwrap() - это функция, позволяющая дождаться выполнения дочерней задачи, фактически простой распаковщик монады Task Task T -> Task T.
Внутри такого цикла находится, фактически, старый код метода OnlyLike() - за тем исключением, что теперь он еще и возвращает ту задачу, которую создал (это нужно, чтобы дождаться ее выполнения). Здесь я позволил себе небольшое ускорение - поскольку я написал return LikeTurbo - каждая следующая итерация цикла будет ждать лишь предыдущей задачи VK.NakrytkaLike - но не будет ждать вывода на экран предыдущих результатов. Если важно именно дождаться вывода результатов - то надо возвращать не LikeTurbo, а результат ContinueWith.
Также тут очень важно расположение вызова TaskScheduler.FromCurrentSynchronizationContext(); Поскольку в момент исполнения прошлой задачи мы можем находиться в любом контексте - то ориентироваться на текущий контекст нельзя. Нужный нам планировщик задач следует сохранить при входе в метод (на будущее: его нужно _всегда_ сохранять _только_ при входе в метод!)