Always use current dispatcher to invoke wpf timer (#7958) fixes #6957

This commit is contained in:
Konrad Müller 2019-10-18 16:07:40 +02:00 коммит произвёл Rui Marinho
Родитель 3623e993b7
Коммит 74d4caa05a
3 изменённых файлов: 33 добавлений и 1 удалений

Просмотреть файл

@ -0,0 +1,31 @@
using System;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using Xamarin.Forms.CustomAttributes;
using Xamarin.Forms.Internals;
namespace Xamarin.Forms.Controls.Issues
{
[Preserve(AllMembers = true)]
[Issue(IssueTracker.Github, 6957, "Device.StartTimer() won't fire on WPF if it is executed on Non UI thread", PlatformAffected.WPF)]
public class Issue6957 : TestContentPage
{
ObservableCollection<string> _entries = new ObservableCollection<string>();
protected override void Init()
{
Device.BeginInvokeOnMainThread(()=> Device.StartTimer(TimeSpan.FromSeconds(2), () => Tick(false)));
Task.Run(() => Device.StartTimer(TimeSpan.FromSeconds(2), () => Tick(true)));
Content = new ListView
{
ItemsSource = _entries
};
}
bool Tick(bool fromOtherThread)
{
_entries.Add($"Tick from {(fromOtherThread ? "other thread" : "main thread")}");
return false;
}
}
}

Просмотреть файл

@ -598,6 +598,7 @@
<SubType>Code</SubType>
</Compile>
<Compile Include="$(MSBuildThisFileDirectory)Issue5793.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue6957.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue6130.xaml.cs">
<SubType>Code</SubType>
</Compile>

Просмотреть файл

@ -141,7 +141,7 @@ namespace Xamarin.Forms.Platform.WPF
public void StartTimer(TimeSpan interval, Func<bool> callback)
{
var timer = new DispatcherTimer { Interval = interval };
var timer = new DispatcherTimer(DispatcherPriority.Background, System.Windows.Application.Current.Dispatcher) { Interval = interval };
timer.Start();
timer.Tick += (sender, args) =>
{