System.Threading.Timer问题(仅限mvvmcross中的计时器)

时间:2013-12-07 23:02:49

标签: c# multithreading timer timeout mvvmcross

任务是创建一个具有最大超时的简单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一个事件。

0 个答案:

没有答案