비동기, 작업, 람다 등을 이해하기 시작했으며 원하는대로 작동시키지 못했습니다. 아래 코드를 사용하여 btnDoWebRequest를 잠 그려면 Tasks로 WebRequests의 번호를 알 수 있습니다. 그리고 일단 모든 작업이 완료되면 btnDoWebRequest를 잠금 해제합니다. 그러나 나는 단지 최대 3 개 또는 어떤 숫자의 작업을 한 번에 실행하고 싶습니다. 이것은 부분적으로는 Have a set of Tasks with only X running at a time입니다.한 번에 최대 실행 작업을 설정하는 동안 여러 비동기 작업을 기다리는 중
하지만 코드를 여러 가지 방법으로 시도하고 수정 한 후에는 즉시 즉시 건너 뛰고 btnDoWebRequest를 다시 사용하게됩니다. 물론 VS는 ".ContinueWith ((task)"와 "await Task.WhenAll (requestInfoList.Select (async i =>)"에서 비동기에 대한 대기 필요성에 대해 경고합니다. 필요한 것을 넣는 방법. 물론 내가 아직도 배우고있는 한,이 모든 일을 잘못하고 모든 일을 다시 할 필요가있는 좋은 기회입니다. 그래서 어떤 도움이라도 크게 감사 할 것입니다.
private SemaphoreSlim maxThread = new SemaphoreSlim(3);
private void btnDoWebRequest_Click(object sender, EventArgs e)
{
btnDoWebRequest.Enabled = false;
Task.Factory.StartNew(async() => await DoWebRequest()).Wait();
btnDoWebRequest.Enabled = true;
}
private async Task DoWebRequest()
{
List<requestInfo> requestInfoList = new List<requestInfo>();
for (int i = 0; dataRequestInfo.RowCount - 1 > i; i++)
{
requestInfoList.Add((requestInfo)dataRequestInfo.Rows[i].Tag);
}
await Task.WhenAll(requestInfoList .Select(async i =>
{
maxThread.Wait();
Task.Factory.StartNew(() =>
{
var task = Global.webRequestWork(i);
}, TaskCreationOptions.LongRunning).ContinueWith((task) => maxThread.Release());
}));
}
이벤트 핸들러는 아마도, 비동기 키워드를 가지고 있지 않기 때문에 컴파일러 오류가 있습니까? 이 없이는 처리기의 await 키워드가 장기간 작동이 완료 될 때까지 기다리는 것이 좋습니다. – brumScouse
그리고 모든 것이 완료 될 때까지 이벤트 핸들러가 차단되므로 서버의 활성화 된 상태를 토글하고 코드를 디버깅하는 경우에만이를 증명할 수 있습니다. – brumScouse