У меня возникли проблемы с методом Async в C# /. NET 4. Он добавляет потоки в процесс w3wp, но не освобождает их. Наш сервер в конечном итоге достигает предела потока около 400, а затем пул приложений становится недоступным, пока он перерабатывается.Async Threads не выпущен
Мы используем EndInvoke здесь неправильно?
Вот упрощенный пример, Repros проблему:
[WebMethod]
public void Test()
{
TestFind("test");
}
private delegate void TestFindDelegate(String val);
private TestFindDelegate tfd;
private IAsyncResult iar;
public void TestFind(String val)
{
try
{
tfd = new TestFindDelegate(this.TestFindAsync);
iar = tfd.BeginInvoke(val, null, null);
}
catch (Exception ex)
{
String msg = ex.Message;
}
}
//Method runs asynchronously
private void TestFindAsync(String val)
{
try
{
//Run stuff here
}
catch (Exception ex)
{
String msg = ex.Message;
}
finally
{
tfd.EndInvoke(iar); //clean up resources
}
}
шагов к Repro:
1. Добавьте код, указанный выше в веб-service.asmx
2. Откройте Диспетчер задач, добавить столбец Темы , найдите процесс
3. Откройте Fiddler, перейдите к Composer и введите URL-адрес веб-сервиса/Тест
4. Нажмите «Выполнить» 20-40 раз
5. Следите за количеством потоков при увеличении процесса, но не уменьшите как таковые.
Вы уверены, что это действительно происходит через '// Run stuff here'? –
Да, этот код воспроизводит проблему как есть, даже без ничего в // Запускаем здесь. –
Вы действительно ошибаетесь, EndInvoke() следует вызывать * после *, метод перестает работать. Третий аргумент BeginInvoke() позволяет передать делегат в обратный вызов завершения, вызвать EndInvoke в этом обратном вызове. –