Обычно я использую следующий асинхронный код:
private async Task<string> Method()
{
var promise = new TaskCompletionSource<string>();
await Task.Run(() =>
{
string answer = null;
//тут что то происходит
promise.SetResult(answer);
});
var result = await promise.Task;
return result;
}
И вызываю его так: await Method();
Если мне нужно записать ответ метода в переменную, я делаю это так:
string x = await Method();
Но недавно я нашёл вот этот код:
public static Task TryInvokeMethodAsync(Action func)
{
var tcs = new TaskCompletionSource<Task>();
Task.Factory.StartNew(() =>
{
try
{
func.Invoke();
tcs.SetResult(null);
}
catch (OperationCanceledException)
{
tcs.SetCanceled();
}
catch (System.Exception ex)
{
tcs.SetException(ex);
}
});
return tcs.Task;
}
Который вызывается так:
TryInvokeMethodAsync(() => AnyMethod());
То есть с помощью этого метода можно любой метод вызвать асинхронно. Но как получить от него ответ (например, тот же string)? TryInvokeMethodAsync возвращает Task, если пытаться получить от него ответ так:
var x = TryInvokeMethodAsync(() => AnyMethod());
А через await он вообще не вызывается, даже если сделать его async.
И вообще, правильный ли асинхронный код я использую?
P.S. как правильно использовать try-catch в первом методе, который указан в самом начале?
Почему бы не так
private async Task<string> Method()
{
return await Task.Run(() =>
{
string answer = null;
//тут что то происходит
return answer;
});
}
или так
public static async Task TryInvokeMethodAsync(Action func)
{
await Task.Run(() =>
{
func.Invoke();
});
}
Или даже так
public static async Task<T> TryInvokeMethodAsync<T>(Func<T> func)
{
return await Task.Run(() =>
{
return func.Invoke();
});
}
А может и так (хотя тут уже непонятно зачем :))
public static async Task<T> TryInvokeMethodAsync<T>(Func<Task<T>> func)
{
return await func();
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
уважаемые программистыПрошу помочь, ибо я уже путаюсь в изученном и найденном материале, а поставленную перед собой задачу решить охота
При отправке запросов на облако vuforia, необходимо составлять Autorization такого вида:
Есть переменная folder, в которой записан путь до папки приложения, его значение - D:\Programming\C#\SKProCH's Launcher\bin\Debug\В другой переменной присваивается...
все никак не мог придумать название моей проблеме, думаю, сейчас тоже не особо вышлоПишу бота на C# для ВК используя библиотеку VKNet