任务是创建一个具有最大超时的简单WebRequest服务。因此,如果加载(获得响应)比例如5秒更长,则返回错误。
根据mvvmcross示例,我创建了IService
public interface IWebRequestService
{
void GetHtmlFromUrl(Action<string> success, Action<Exception> error , string url );
}
然后服务
public class WebRequestService : IWebRequestService
{
public void GetHtmlFromUrl(Action<string> success, Action<Exception> error, string url)
{
var request = (HttpWebRequest) WebRequest.Create(url);
var tw = new TimeOut(500);
tw.TimeHasElapsed += sender => { if (!request.HaveResponse) request.Abort(); };
try
{
request.BeginGetResponse(result => ProcessResponse(success, error, request, result), null);
}
catch (Exception exception)
{
error(exception);
}
}
private void ProcessResponse(Action<string> success, Action<Exception> error, HttpWebRequest request,
IAsyncResult result)
{
try
{
WebResponse response = request.EndGetResponse(result);
using (Stream stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
string text = reader.ReadToEnd();
success(text);
}
}
catch (Exception exception)
{
error(exception);
}
}
}
和TimeOut类
public class TimeOut
{
public delegate void EventHandler(object sender);
private readonly int _time;
private Timer InnerTimer;
public TimeOut(int time)
{
_time = time;
InitializeTimer();
}
private void InitializeTimer()
{
InnerTimer = null;
InnerTimer = new Timer(Callback, null, _time, Timeout.Infinite);
}
private void Callback(object state)
{
InnerTimer.Change(Timeout.Infinite, Timeout.Infinite);
if (TimeHasElapsed != null) TimeHasElapsed(this);
}
public event EventHandler TimeHasElapsed;
}
当我第一次得到回复时,一切正常。但是对于第二次和下一次,Timer存在问题。 Callback方法被调用x次,它会导致UI滞后。
甚至以某种顺序(2 ^ n)调用它,其中n试图获得响应。
我试过把Timer.Dispose(); Timer = null; if(timer!= null)进入Callback方法。 没有任何改变。
对此存在解决方案吗?
编辑: 实际上这段代码完全没问题,问题是我忘记了ViewModel中的null一个事件。