Функция за промяна на PCL таймера

Бях проверил Timer in Portable Library, но нямах представа как да извикам функцията Change , защото не е имплементиран в класа, нито е наследен от родител.

_timer = new Timer(OnTimerTick, null, TimeSpan.FromSeconds(1.0), TimeSpan.Zero);
_timer.Change(TimeSpan.FromSeconds(1.0), TimeSpan.Zero); //how to implement this

person Chris Lui    schedule 08.04.2015    source източник
comment
това за проект Xamarin.Forms ли е?   -  person Jason    schedule 08.04.2015
comment
Няма функция за промяна. Просто го изхвърлете и създайте нов.   -  person Artur Shamsutdinov    schedule 08.04.2015
comment
@Jason, просто нормален PCL проект на xamarin, използващ mvvmcross   -  person Chris Lui    schedule 08.04.2015
comment
@ArturShamsutdinov, но според урока на Stuart Lodge трябва да има такъв и трябваше да проверя класа System.Threading.Timer в msdn, той предостави 3 претоварени функции Change().   -  person Chris Lui    schedule 08.04.2015
comment
Към кой PCL профил се насочвате?   -  person Anders Gustafsson    schedule 08.04.2015
comment
@AndersGustafsson Използвам Profile78.   -  person Chris Lui    schedule 09.04.2015


Отговори (2)


Вместо да използвам първото решение: (изграждане на класа Timer) от David Kean, сега използвам неговото 3-то решение: (създаване на целеви .NET 4.0 Timer адаптер) с примерния код от Henry C.

Както и да е, все още се надявам да получа обратна връзка за това как да внедря функцията Change в класа Timer, както е дефинирано в .NET. Благодаря!

public class PCLTimer
{
    private System.Threading.Timer timer;
    private Action<object> action;

    public PCLTimer(Action<object> action, object state, int dueTimeMilliseconds, int periodMilliseconds)
    {
        this.action = action;
        timer = new System.Threading.Timer(PCLTimerCallback, state, dueTimeMilliseconds, periodMilliseconds);
    }

    public PCLTimer(Action<object> action, object state, TimeSpan dueTimeMilliseconds, TimeSpan periodMilliseconds)
    {
        this.action = action;
        timer = new System.Threading.Timer(PCLTimerCallback, state, dueTimeMilliseconds, periodMilliseconds);
    }

    private void PCLTimerCallback(object state)
    {
        action.Invoke(state);
    }

    public bool Change(int dueTimeMilliseconds, int periodMilliseconds)
    {
        return timer.Change(dueTimeMilliseconds, periodMilliseconds);
    }

    public bool Change(TimeSpan dueTimeMilliseconds, TimeSpan periodMilliseconds)
    {
        return timer.Change(dueTimeMilliseconds, periodMilliseconds);
    }

    public new void Dispose()
    {
        timer.Dispose();
    }
}
person Chris Lui    schedule 09.04.2015

Разработих библиотека за поддръжка, съдържаща типове, липсващи или непълни в PCL. Библиотеката се нарича Shim и е достъпна и на NuGet.

Shim се предлага в различни екземпляри за различни целеви платформи. Ако инсталирате Shim от NuGet, той ще избере съответния екземпляр за вашия проект на Visual Studio, било то преносима библиотека от класове, приложение за Windows 8 или клас Xamarin.Android библиотека.

Shim съдържа декларация на System.Threading.Timer, включително два конструктора и метода Change(int, int). Когато използвате Shim от приложение на Windows 8 или библиотека с класове, има специфична за Windows 8 реализация, използваща вътрешно класа Windows.System.Threading.ThreadPoolTimer. За другите (не-PCL) цели на платформата се използва [TypeForwardedTo] декларация за препращане на повиквания към съществуващата реализация за тази конкретна цел.

Някои общи подробности за изпълнението могат да бъдат намерени в този SO отговор. Ако не искате режийните разходи на пълния пакет Shim, можете да използвате подхода, представен в този SO отговор, за да внедрите сами необходимите части.

person Anders Gustafsson    schedule 20.04.2015