Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Force MainThreadScheduler to yield even when called from the main thread #5139

Merged
merged 3 commits into from
Jul 18, 2018

Conversation

sharwell
Copy link
Member

@sharwell sharwell commented Jul 5, 2018

Fixes #5134

📝 If the underlying cause of the bug was an infinite recursive loop in code, this pull request will avoid a Stack Overflow but may not correct the source of the problem. The implementation change here is similar to tail call elimination, and assumes the sequence is finite but can be larger that what fits in a stack.

@codecov
Copy link

codecov bot commented Jul 5, 2018

Codecov Report

Merging #5139 into master will increase coverage by 0.02%.
The diff coverage is 60.41%.

@@            Coverage Diff             @@
##           master    #5139      +/-   ##
==========================================
+ Coverage   34.92%   34.94%   +0.02%     
==========================================
  Files         563      564       +1     
  Lines       44673    44719      +46     
  Branches     6193     6194       +1     
==========================================
+ Hits        15600    15629      +29     
- Misses      28293    28311      +18     
+ Partials      780      779       -1

Copy link
Member

@drewnoakes drewnoakes left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks simple enough.

Is there likely to be any downside to this? Given this only occurred in one location. If this introduces significant latency for other operations, then we could just fix the problem in this instance.

@gerhardol
Copy link
Member

gerhardol commented Jul 5, 2018

Still get an exception
Edit: Incorrect stacktrace first time.

image

Stack trace
 	[Managed to Native Transition]	
 	System.Drawing.dll!System.Drawing.Font.GetHeight()	Unknown
 	System.Drawing.dll!System.Drawing.Font.Height.get()	Unknown
 	System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRow.DataGridViewRow()	Unknown
 	System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRow.Clone()	Unknown
 	System.Windows.Forms.dll!System.Windows.Forms.DataGridViewRowCollection.this[int].get(int index)	Unknown
>	GitUI.dll!GitUI.BuildServerIntegration.BuildServerWatcher.OnBuildInfoUpdate(GitUIPluginInterfaces.BuildServerIntegration.BuildInfo buildInfo) Line 279	C#
 	System.Reactive.Core.dll!System.Reactive.AnonymousSafeObserver.OnNext(GitUIPluginInterfaces.BuildServerIntegration.BuildInfo value)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod, bool synchronouslyBlocking, Microsoft.VisualStudio.Threading.JoinableTaskCreationOptions creationOptions, System.Delegate entrypointOverride)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func asyncMethod)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule(object state, System.TimeSpan dueTime, System.Func action) Line 18	C#
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__1(object state2)	Unknown
 	System.Reactive.Core.dll!System.Reactive.ScheduledObserver.Run(object state, System.Action recurse)	Unknown
 	System.Reactive.Core.dll!System.Reactive.Concurrency.Scheduler.InvokeRec1.AnonymousMethod__2(System.Reactive.Concurrency.IScheduler scheduler1, System.__Canon state3)	Unknown
 	GitUI.dll!GitUI.UserControls.MainThreadScheduler.Schedule.AnonymousMethod__0() Line 23	C#
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.ExecuteJob(System.Func asyncMethod, Microsoft.VisualStudio.Threading.JoinableTask job)	Unknown
 	Microsoft.VisualStudio.Threading.dll!Microsoft.VisualStudio.Threading.JoinableTaskFactory.RunAsync(System.Func

@sharwell
Copy link
Member Author

sharwell commented Jul 5, 2018

@gerhardol Do you have steps to reproduce this? The original issue did not include them.

(Ideally the original issue would be edited to insert steps to reproduce in the first post, where it currently says "Don't know".)

@gerhardol
Copy link
Member

gerhardol commented Jul 5, 2018

It occurs in a specific repo with Jenkins that I cannot share. I have not figured out what is specific with the repo.

Edit: this occurs when opening, every time. Not sure if I have access to the setup after tomorrow, for some weeks.

@jbialobr
Copy link
Member

jbialobr commented Jul 5, 2018

For me, it happens when solving merge conflicts but only sometimes - don't know how to reproduce it.

Copy link
Member

@gerhardol gerhardol left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The change did not fix the problem for me and without deep knowledge about threading my vote will not have much value. But it looks ok to me.

@sharwell sharwell closed this Jul 7, 2018
@sharwell
Copy link
Member Author

sharwell commented Jul 14, 2018

@gerhardol Are you absolutely certain that my change was applied when you observed the failure with this pull request? I'm asking because the stack trace of the exception was unchanged from the one in the original issue (including the appearance of line 23, which had one meaning before this pull request and a different meaning after), and at minimum I would have expected this pull request to slightly change the stack trace.

@sharwell sharwell reopened this Jul 14, 2018
@sharwell
Copy link
Member Author

sharwell commented Jul 14, 2018

Reopening this pull request because I believe the analysis by @gerhardol was partially in error (either the stack trace from the new failure was incorrectly copied, or the application wasn't using the new code at the time of the failure).

📝 I'm not saying this pull request fixes the issue, because I was never able to reproduce it. I am simply saying I am not longer confident that this pull request doesn't fix the issue, so we should review it again to be sure.

Copy link
Member

@RussKie RussKie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@gerhardol
Copy link
Member

I could reproduce the problem on a specific repo in a specific environment that I do not have full access to. I got to the computer again today.
However, I cannot reproduce the problem right now. I have tried the branch I tested (#5104). I tested this PR branch as well as before the PR, also OK. So no longer reproducible.

For the original test, I know I screwed up the first time, but then I updated the stacktrace as noted in the post. I am pretty sure I got the problem with the change too though. Of course, this may still be a a required part of the solution.

Copy link
Member

@jbialobr jbialobr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have not come across the SO issue since I merged this patch. It is not 100% prove of correctness since I was not able to reproduce the issue consistently, but the patch seems to be correct and harmless.

@@ -19,7 +19,15 @@ public override IDisposable Schedule<TState>(TState state, TimeSpan dueTime, Fun
async () =>
{
await Task.Delay(normalizedTime, token);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The context does not need to be captured here.

await Task.Delay(normalizedTime, token).ConfigureAwait(false);

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I used ConfigureAwaitRunInline, a new extension from vs-threading 15.8. For now I had to define a copy of the extension in GitExtUtils, but I'm going to start the process of updating Git Extensions to use the new version of vs-threading.

This method is provided by vs-threading 15.8, but Git Extensions is not yet
updated to that version. A copy is included temporarily, and can be removed
when the project updates to a newer version of the vs-threading library.
@RussKie RussKie merged commit 0860f9f into gitextensions:master Jul 18, 2018
@sharwell sharwell deleted the fix-stack-overflow branch July 18, 2018 16:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants