Я создал небольшую библиотеку классов для асинхронного вызова WebService (Fire and Forget. Мне не нужен результат).
В приложении Windows Form метод XXXAsync()
работает нормально.Но в веб-приложении процесс блокируется до тех пор, пока событие XXXCompleted
не сработает.
Моя проблема: я попытался создать делегат и использовал Begin / EndInvoke для вызова метода XXXAsync()
.Он работал нормально, но процесс w3wp, похоже, потребляет огромное количество памяти. Я правильно вызываю метод EndInvoke .Вызов GC.Collect
не освободил память.
Я также попытался вызвать методы BeginXXX и EndXXXX из WebService и получил тот же результат.
Мой WebService - тупой HelloWorld, сa Thread.Sleep(10000)
.
Как решить эту проблему?Есть ли другой способ вызвать веб-сервис асинхронно, избегая таких утечек?
Редактировать [Добавлен код ниже]:
Код WebService :
<code> [WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service1 : WebService
{
[WebMethod]
[OneWay]
public string HelloWorld()
{
Thread.Sleep(10000);
return "Hello World ";
}
}
ClassLibrary :
<code> public class HelloLibrary : IDisposable
{
private delegate void PerformWhatever();
public HelloLibrary(){}
public string Notify()
{
PerformWhatever p = new PerformWhatever(OnBeforeBegin);
p.BeginInvoke(EndInvokeHandler, p);
return "1";
}
private void OnBeforeBegin()
{
using (localhost.Service1 s = new localhost.Service1())
{
s.HelloWorldAsync();
}
}
private void EndInvokeHandler(IAsyncResult r)
{
var delegateInstance = r.AsyncState as PerformWhatever;
delegateInstance.EndInvoke(r);
}
public void Dispose(){}
}
И, в моем веб-приложении ,Я звоню:
<code>
using (HelloLibrary library = new HelloLibrary())
{
library.Notify();
}