Always use current dispatcher to invoke wpf timer (#7958) fixes #6957
authorKonrad Müller <11095003+krdmllr@users.noreply.github.com>
Fri, 18 Oct 2019 14:07:40 +0000 (16:07 +0200)
committerRui Marinho <me@ruimarinho.net>
Fri, 18 Oct 2019 14:07:40 +0000 (15:07 +0100)
Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue6957.cs [new file with mode: 0644]
Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems
Xamarin.Forms.Platform.WPF/WPFPlatformServices.cs

diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue6957.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue6957.cs
new file mode 100644 (file)
index 0000000..7274c04
--- /dev/null
@@ -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; 
+               }
+       }
+}  
\ No newline at end of file
index b9ffb0f..243a397 100644 (file)
       <SubType>Code</SubType>
     </Compile>
     <Compile Include="$(MSBuildThisFileDirectory)Issue5793.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)Issue6957.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Issue6130.xaml.cs">
       <SubType>Code</SubType>
     </Compile>
index 5047bf1..3819039 100644 (file)
@@ -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) =>
                        {