Наскільки я намагався з'ясувати, щоб виявити a sync
метод до async
:
private async void RefreshScreen()
{
await System.Threading.Tasks.Task.Run(() =>
{
this.refreshContent();
this.refreshTokens();
}
);
}
Хіба в будь-якому разі не можна отримати це більш елегантним способом?
РЕДАГУВАТИ
Як ви можете зрозуміти RefreshContent()
і RefreshTokens()
беруть участь у кількох дзвінках до веб-служби.
Ця реалізація клієнтської веб-послуги забезпечує sync
і async
способи виклику методу:
public async System.Threading.Tasks.Task<string> GetUrlAsync ()
{
ApiResponse<string> localVarResponse = await GetUrlAsyncWithHttpInfo();
return localVarResponse.Data;
}
public string GetUrl ()
{
ApiResponse<string> localVarResponse = GetUrlWithHttpInfo();
return localVarResponse.Data;
}
В даний час ми використовуємо "sync"
методи, і, звичайно, ми хочемо продовжувати використовувати async
дзвінки
Приклад:
public Enumerable<Element> GatherElements()
{
return yield new Element() {
Field1 = RESTClient.GetMethod1(),
Field2 = RESTClient.GetMethod2(),
Field3 = RESTClient.GetMethod3(),
Field4 = RESTClient.GetMethod4(),
Field5 = RESTClient.GetMethod5(),
Field6 = RESTClient.GetMethod6(),
Field7 = RESTClient.GetMethod7()
};
}
Я не хочу чекати, поки завершаться всі дзвінки для відпочинку, я хочу повернути всі Елементи, незалежно від того, чи кожен Field
заповнений.
Я не знаю, чи я так добре пояснив.
Відповіді:
3 для відповіді № 1Ви "підходите до проблеми" назад ". Замість того, щоб намагатися зрозуміти, як" зробити цей метод асинхронним ", вам слід почати з іншого кінця.
Наприклад, що робить refreshContent
робити? Чи виконує він введення-виведення повільно, можливо, потрапляючи в веб-API або базу даних? Тоді ви починаєте з тих низькорівневих дзвінків в Інтернет / базу даних. Зробіть ці асинхронні перший (обидва HttpClient
та Entity Framework мають вбудовану асинхронну підтримку). Потім await
ці дзвінки, і нехай async
рости звідти.
Якщо ви застосуєте такий підхід, вам допоможе компілятор, наприклад, він порекомендує вам змінити типи повернення на Task
/Task<T>
коли ви додаєте async
. Як зазначали інші, ви повинні уникати async void
. Вам також не потрібно буде користуватися Task.Run
окрім випадків, коли ви виконуєте важкі операційні процеси, які вам потрібно розвантажити.
Зрештою, у вас все вийде async Task RefreshScreen
, на який ви можете зателефонувати з async void
обробник подій.