TPL을 C# (.NET 4.0)에서 사용하고 있습니다.LimitedConcurrencyLevelTaskScheduler를 사용하면 계속 작업이 중단됩니다.
웹 요청 생성을 쉽게하고 (연속 작업을 사용하여 비동기 적으로) 콘텐츠를 다운로드하는 맞춤 API를 만들었습니다. 그 부분은 잘 작동합니다.
LimitedConcurrencyLevelTaskScheduler
(Samples for Parallel Programming과 MSDN documentation for tasks에서 찾을 수 있음)을 지연된 작업 생성과 함께 사용하려고하면이 문제가 발생합니다. 해당 클래스에 익숙하지 않은 경우 예약 된 작업의 동시성 정도가 임의의 숫자로 제한됩니다.
기본적으로 웹 요청 작업 체인 생성을 LimitedConcurrencyLevelTaskScheduler
에 의해 예약 된 작업으로 연기하여 동시 다운로드 수를 제한 할 수 있습니다. Task
의 생성을 연기 할 때
As suggested by the sage Stephen Toub
는, 할 수있는 가장 좋은 것은Func<Task>
또는
Func<Task<TResult>>
를 반환하기 위해 API를 설계하는 것입니다. 나는 이것을했다.
아쉽게도 첫 번째 동시 작업 세트를 예약 한 후 내 프로그램이 중단됩니다. 내 작업이 4 도의 동시성으로 제한되어 있다고 가정 해보십시오. 이 경우 4 개의 작업이 시작되고 프로그램이 중단됩니다. 작업이 완료되지 않습니다.
나는이 문제를 간단히 설명하기 위해 최소한의 예를 만들었습니다. WebRequest
을 사용하는 대신 파일 읽기를 사용하고 있습니다. 내가 "는 응답"에 의해 무슨 뜻인지 명확히하기 위해 1
class Program
{
static Func<Task> GetReadTask()
{
return() =>
{
Console.WriteLine("Opening file.");
FileStream fileStream = File.Open("C:\\Users\\Joel\\Desktop\\1.txt", FileMode.Open);
byte[] buffer = new byte[32];
Console.WriteLine("Beginning read.");
return Task<int>.Factory.FromAsync(fileStream.BeginRead, fileStream.EndRead, buffer, 0, 32, null).ContinueWith(task => fileStream.Close());
};
}
static void Main()
{
LimitedConcurrencyLevelTaskScheduler ts = new LimitedConcurrencyLevelTaskScheduler(1);
TaskFactory factory = new TaskFactory(ts);
int[] range = {1, 2, 3};
var tasks = range.Select(number =>
{
Func<Task> getTask = GetReadTask();
return factory.StartNew(() =>
{
var task = getTask();
task.Wait();
});
});
Task.WaitAll(tasks.ToArray());
}
}
에 동시성의 정도를 제한이 출력이 모습입니다.
Opening file.
Beginning read.
그리고 나서 영원히 아무것도 인쇄되지 않습니다.
무슨 일이 일어나고 있는지에 대한 단서가 있습니까?
이것은 내 질문을 완벽하게 설명하지 못합니다! 예제 코드도 가져 주셔서 감사합니다. 그러나 작업 대기열을 구현하여 현재 임의의 수의 스레드 만 현재 "진행 중"이되도록합니다. 다시 한 번 감사드립니다! –