Startup.Configure에서 비동기 작업을 어떻게 처리합니까?
내 ASP.NET 5 앱에서 Azure의 일부 데이터를 Startup.Configure 메서드 내부의 캐시로로드하려고합니다. Azure SDK는 비동기 메서드를 독점적으로 노출합니다. 일반적으로 비동기 메서드 호출은 다음과 같이 비동기 메서드 내에서 await를 통해 수행됩니다.
public async Task Configure(IApplicationBuilder app, IMemoryCache cache)
{
Data dataToCache = await DataSource.LoadDataAsync();
cache.Set("somekey", dataToCache);
// remainder of Configure method omitted for clarity
}
그러나 ASP.NET 5에서는 Configure 메서드가 void를 반환해야합니다. 나는 무효 방법 비동기을 사용할 수 있지만 나의 이해는 무효 방법 만 생각하는 비동기에 따라 (이벤트 핸들러에 사용할 수 있다는 점이다 https://msdn.microsoft.com/en-us/magazine/jj991977.aspx 많은 다른 사람의 사이에서 ).
이 작업을 수행하는 더 좋은 방법은 await없이 비동기 함수를 호출하고 반환 된 Task에서 Wait를 호출 한 다음 Task.Results 속성을 통해 결과를 다음과 같이 캐시하는 것입니다.
public void Configure(IApplicationBuilder app, IMemoryCache cache)
{
Task<Data> loadDataTask = DataSource.LoadDataAsync();
loadDataTask.Wait();
cache.Set("somekey", loadDataTask.Result);
// remainder of Configure method omitted for clarity
}
Stephen Walther는 올해 초 블로그 게시물 에서 유사한 접근 방식을 사용 했습니다. 그러나 이것이 허용 가능한 관행으로 간주되는지 해당 게시물에서 명확하지 않습니다. 맞나요?
이것이 허용 가능한 관행으로 간주되는 경우 오류 처리가 필요한 경우 무엇입니까? 내 이해는 Task.Wait ()가 비동기 작업에 의해 발생한 모든 예외를 다시 던지고 비동기 작업을 취소하는 메커니즘을 제공하지 않았다는 것입니다. 단순히 Task.Wait () 호출만으로 충분합니까?
링크 한 블로그의 예제 코드는 예제 데이터로 데이터베이스를 채우기 위해 sync-over-async 만 사용했습니다. 그 호출은 프로덕션 앱에 존재하지 않습니다.
첫째, 진정 Configure
으로 비동기식이어야한다면 ASP.NET 팀에 문제를 제기하여 레이더에 포함되도록해야합니다. ConfigureAsync
이 시점 (즉, 릴리스 전)에 대한 지원을 추가하는 것은 그리 어렵지 않습니다 .
둘째, 문제에 대한 몇 가지 접근 방식이 있습니다. 당신은 할 수 사용 task.Wait
(또는 더 나은 아직, task.GetAwaiter().GetResult()
은 피할 수있는 AggregateException
오류가 발생하는 경우 래퍼). 또는 작업 의 결과 가 아닌 작업을 캐시 할 수 있습니다 ( IMemoryCache
이상한 직렬화가 이진 배열로 메모리에있는 것보다 사전에 더 가깝다 면 작동합니다 -이전 버전의 ASP). .그물).
이것이 허용 가능한 관행으로 간주되는 경우 오류 처리가 필요한 경우 무엇입니까?
를 사용 GetAwaiter().GetResult()
하면 예외 (있는 경우)가 Configure
. 그래도 응용 프로그램 구성 이 실패 하면 ASP.NET이 어떻게 반응할지 잘 모르겠습니다 .
비동기 작업을 취소하는 메커니즘을 제공하지 않았습니다.
응용 프로그램 설정을 "취소"할 수있는 방법을 잘 모르겠습니다 . 따라서 그 부분에 대해서는 걱정하지 않겠습니다.
일부 비동기 작업을 수행 할 수 있지만 메서드는 동기식이므로 변경할 수 없습니다. 즉, 비동기 호출이 완료 될 때까지 동 기적으로 기다려야합니다.
아직 시작이 완료되지 않은 경우 Startup 메서드에서 복귀하고 싶지 않습니까? 귀하의 솔루션은 괜찮은 것 같습니다.
예외 처리와 관련하여 : 애플리케이션이 없이는 제대로 실행할 수없는 작업이있는 경우 Startup 메서드가 실패하도록해야합니다 ( Fail-fast 참조 ). 중요한 것이 아니라면 관련 부분을 try catch 블록으로 묶고 나중에 검사 할 수 있도록 문제를 기록합니다.
여기에있는 답변은 비동기 코드가 추가 비동기 호출을하는 경우, 특히 콜백 인 경우 항상 올바르게 작동하지 않는 경우 코드 교착 상태를 찾을 수 있습니다.
이것은 나를 위해 여러 번 발생 Nito.AsyncEx
했으며 큰 효과를 사용했습니다 .
using Nito.AsyncEx;
AsyncContext.Run(async () => { await myThing.DoAsyncTask(); });
참고 URL : https://stackoverflow.com/questions/32257640/how-do-i-handle-async-operations-in-startup-configure
'IT TIP' 카테고리의 다른 글
Python 세트에서 세트 제거 (0) | 2020.11.28 |
---|---|
window.location이 변경되면 중단됩니까? (0) | 2020.11.28 |
NGINX의 프록시 응답에서 URL을 어떻게 다시 작성합니까? (0) | 2020.11.27 |
Safari를 제외한 모든 브라우저에서 작동하는 Flexbox 코드. (0) | 2020.11.27 |
.Net 프로젝트 (Sandcastle)에 대한 네임 스페이스 문서? (0) | 2020.11.27 |