Skip to content

Commit f28d696

Browse files
committed
Move InvokeScript SwitchToMainThreadAsync to OutputToolWindowControl
1 parent 6dec568 commit f28d696

File tree

4 files changed

+69
-69
lines changed

4 files changed

+69
-69
lines changed

SharedProject/Core/FCCEngine.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -146,27 +146,27 @@ private async System.Threading.Tasks.Task<string[]> RunCoverageAsync(List<ICover
146146
var coverageProjectHasFailed = coverageProject.HasFailed;
147147
if (coverageProjectHasFailed) // todo remove step
148148
{
149-
await reportGeneratorUtil.LogCoverageProcessAsync($"{coverageProject.ProjectName} failed : {coverageProject.FailureDescription}");
149+
reportGeneratorUtil.LogCoverageProcess($"{coverageProject.ProjectName} failed : {coverageProject.FailureDescription}");
150150
}
151151
await coverageProject.StepAsync("Run Coverage Tool", async (project) =>
152152
{
153153
var start = DateTime.Now;
154154
try
155155
{
156156
var coverageTool = coverageUtilManager.CoverageToolName(project);
157-
await reportGeneratorUtil.LogCoverageProcessAsync($"Starting {coverageTool} coverage for {project.ProjectName}");
157+
reportGeneratorUtil.LogCoverageProcess($"Starting {coverageTool} coverage for {project.ProjectName}");
158158
await coverageUtilManager.RunCoverageAsync(project, true);
159159
}catch(Exception exc)
160160
{
161-
await reportGeneratorUtil.LogCoverageProcessAsync($"{coverageProject.ProjectName} failed : {exc}");
161+
reportGeneratorUtil.LogCoverageProcess($"{coverageProject.ProjectName} failed : {exc}");
162162
throw exc;
163163
}
164164
if (!cancellationToken.IsCancellationRequested)
165165
{
166166
var duration = DateTime.Now - start;
167167
var durationMessage = $"Completed coverage for {coverageProject.ProjectName} : {duration}";
168168
logger.Log(durationMessage);
169-
await reportGeneratorUtil.LogCoverageProcessAsync(durationMessage);
169+
reportGeneratorUtil.LogCoverageProcess(durationMessage);
170170
}
171171
});
172172
}
@@ -243,32 +243,32 @@ private async System.Threading.Tasks.Task PrepareCoverageProjectsAsync(List<ICov
243243
}
244244
logger.Log($"File synchronization duration : {fileSynchronizationDetails.Duration}");
245245
var itemOrItems = logs.Count == 1 ? "item" : "items";
246-
await reportGeneratorUtil.LogCoverageProcessAsync($"File synchronization {logs.Count} {itemOrItems}, duration : {fileSynchronizationDetails.Duration}");
246+
reportGeneratorUtil.LogCoverageProcess($"File synchronization {logs.Count} {itemOrItems}, duration : {fileSynchronizationDetails.Duration}");
247247
}
248248
}
249249
}
250250

251-
private async System.Threading.Tasks.Task DisplayCoverageResultAsync(System.Threading.Tasks.Task<(List<CoverageLine> coverageLines, string reportHtml)> t)
251+
private void DisplayCoverageResult(System.Threading.Tasks.Task<(List<CoverageLine> coverageLines, string reportHtml)> t)
252252
{
253253
switch (t.Status)
254254
{
255255
case System.Threading.Tasks.TaskStatus.Canceled:
256256
LogReloadCoverageStatus(ReloadCoverageStatus.Cancelled);
257-
await reportGeneratorUtil.LogCoverageProcessAsync("Coverage cancelled");
257+
reportGeneratorUtil.LogCoverageProcess("Coverage cancelled");
258258
break;
259259
case System.Threading.Tasks.TaskStatus.Faulted:
260260
LogReloadCoverageStatus(ReloadCoverageStatus.Error);
261261
logger.Log(t.Exception.InnerExceptions[0]);
262-
await reportGeneratorUtil.LogCoverageProcessAsync(t.Exception.ToString());
262+
reportGeneratorUtil.LogCoverageProcess(t.Exception.ToString());
263263
break;
264264
case System.Threading.Tasks.TaskStatus.RanToCompletion:
265265
LogReloadCoverageStatus(ReloadCoverageStatus.Done);
266-
#pragma warning disable VSTHRD103 // Call async methods when in an async method
266+
#pragma warning disable VSTHRD002 // Avoid problematic synchronous waits
267267
UpdateUI(t.Result.coverageLines, t.Result.reportHtml);
268-
#pragma warning restore VSTHRD103 // Call async methods when in an async method
268+
#pragma warning restore VSTHRD002 // Avoid problematic synchronous waits
269269
break;
270270
}
271-
await reportGeneratorUtil.EndOfCoverageRunAsync();
271+
reportGeneratorUtil.EndOfCoverageRun();
272272

273273
}
274274

@@ -284,7 +284,7 @@ private async System.Threading.Tasks.Task PollInitializedStatusAsync(Cancellatio
284284
return;
285285

286286
case InitializeStatus.Initializing:
287-
await reportGeneratorUtil.LogCoverageProcessAsync("Initializing");
287+
reportGeneratorUtil.LogCoverageProcess("Initializing");
288288
LogReloadCoverageStatus(ReloadCoverageStatus.Initializing);
289289
await System.Threading.Tasks.Task.Delay(InitializeWait);
290290
break;
@@ -305,7 +305,7 @@ public void ReloadCoverage(Func<System.Threading.Tasks.Task<List<ICoverageProjec
305305

306306
await PollInitializedStatusAsync(cancellationToken);
307307

308-
await reportGeneratorUtil.LogCoverageProcessAsync("Starting coverage - full details in FCC Output Pane");
308+
reportGeneratorUtil.LogCoverageProcess("Starting coverage - full details in FCC Output Pane");
309309
LogReloadCoverageStatus(ReloadCoverageStatus.Start);
310310

311311
var coverageProjects = await coverageRequestCallback();
@@ -325,7 +325,7 @@ public void ReloadCoverage(Func<System.Threading.Tasks.Task<List<ICoverageProjec
325325
return (coverageLines, reportHtml);
326326

327327
}, cancellationToken)
328-
.ContinueWith(DisplayCoverageResultAsync, System.Threading.Tasks.TaskScheduler.Default);
328+
.ContinueWith(DisplayCoverageResult, System.Threading.Tasks.TaskScheduler.Default);
329329

330330
}
331331
}

SharedProject/Core/ReportGenerator/ReportGeneratorUtil.cs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ interface IReportGeneratorUtil
2626
string ProcessUnifiedHtml(string htmlForProcessing,string reportOutputFolder);
2727
Task<ReportGeneratorResult> GenerateAsync(IEnumerable<string> coverOutputFiles,string reportOutputFolder, bool throwError = false);
2828
string BlankReport(bool withHistory);
29-
Task LogCoverageProcessAsync(string message);
30-
Task EndOfCoverageRunAsync();
29+
void LogCoverageProcess(string message);
30+
void EndOfCoverageRun();
3131
}
3232

3333
internal class ReportGeneratorResult
@@ -216,23 +216,23 @@ async Task<bool> run(string outputReportType, string inputReports)
216216
var reportGeneratorResult = new ReportGeneratorResult { Success = false, UnifiedHtml = null, UnifiedXmlFile = unifiedXmlFile };
217217
218218
var startTime = DateTime.Now;
219-
await LogCoverageProcessAsync("Generating cobertura report");
219+
LogCoverageProcess("Generating cobertura report");
220220
var coberturaResult = await run("Cobertura", string.Join(";", coverOutputFiles));
221221
var duration = DateTime.Now - startTime;
222222
223223
if (coberturaResult)
224224
{
225225
var coberturaDurationMesage = $"Cobertura report generation duration - {duration}";
226-
await LogCoverageProcessAsync(coberturaDurationMesage); // result output includes duration for normal log
226+
LogCoverageProcess(coberturaDurationMesage); // result output includes duration for normal log
227227
228228
startTime = DateTime.Now;
229-
await LogCoverageProcessAsync("Generating html report");
229+
LogCoverageProcess("Generating html report");
230230
var htmlResult = await run("HtmlInline_AzurePipelines", unifiedXmlFile);
231231
duration = DateTime.Now - startTime;
232232
if (htmlResult)
233233
{
234234
var htmlReportDurationMessage = $"Html report generation duration - {duration}";
235-
await LogCoverageProcessAsync(htmlReportDurationMessage); // result output includes duration for normal log
235+
LogCoverageProcess(htmlReportDurationMessage); // result output includes duration for normal log
236236
reportGeneratorResult.UnifiedHtml = fileUtil.ReadAllText(unifiedHtmlFile);
237237
reportGeneratorResult.Success = true;
238238
}
@@ -1687,16 +1687,14 @@ public string BlankReport(bool withHistory)
16871687
return ProcessUnifiedHtml(resourceProvider.ReadResource("dummyReportToProcess.html"),null);
16881688
}
16891689

1690-
public async Task LogCoverageProcessAsync(string message)
1690+
public void LogCoverageProcess(string message)
16911691
{
1692-
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
16931692
eventAggregator.SendMessage(new InvokeScriptMessage(CoverageLogJSFunctionName, message));
16941693
logs.Add(message);
16951694
}
16961695

1697-
public async Task EndOfCoverageRunAsync()
1696+
public void EndOfCoverageRun()
16981697
{
1699-
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
17001698
eventAggregator.SendMessage(new InvokeScriptMessage(ShowFCCWorkingJSFunctionName, false));
17011699
}
17021700

SharedProject/Impl/TestContainerDiscovery/TestContainerDiscoverer.cs

Lines changed: 40 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,15 @@ IReportGeneratorUtil reportGeneratorUtil
7070
_ = ThreadHelper.JoinableTaskFactory.RunAsync(taskProvider);
7171
};
7272

73-
private async System.Threading.Tasks.Task TestExecutionStartingAsync(IOperation operation)
73+
private void TestExecutionStarting(IOperation operation)
7474
{
7575
fccEngine.StopCoverage();
7676

7777
var settings = appOptionsProvider.Get();
7878
if (!settings.Enabled)
7979
{
80-
await CombinedLogAsync("Coverage not collected as FCC disabled.");
81-
await reportGeneratorUtil.EndOfCoverageRunAsync();
80+
CombinedLog("Coverage not collected as FCC disabled.");
81+
reportGeneratorUtil.EndOfCoverageRun();
8282
return;
8383
}
8484
if (settings.RunInParallel)
@@ -92,17 +92,17 @@ private async System.Threading.Tasks.Task TestExecutionStartingAsync(IOperation
9292
}
9393
else
9494
{
95-
await CombinedLogAsync("Coverage collected when tests finish. RunInParallel option true for immediate");
95+
CombinedLog("Coverage collected when tests finish. RunInParallel option true for immediate");
9696
}
9797
}
9898

99-
private async System.Threading.Tasks.Task CombinedLogAsync(string message)
99+
private void CombinedLog(string message)
100100
{
101-
await reportGeneratorUtil.LogCoverageProcessAsync(message);
101+
reportGeneratorUtil.LogCoverageProcess(message);
102102
logger.Log(message);
103103
}
104104

105-
private async System.Threading.Tasks.Task TestExecutionFinishedAsync(IOperation operation)
105+
private void TestExecutionFinished(IOperation operation)
106106
{
107107
var settings = appOptionsProvider.Get();
108108
if (!settings.Enabled || settings.RunInParallel)
@@ -112,8 +112,8 @@ private async System.Threading.Tasks.Task TestExecutionFinishedAsync(IOperation
112112
var testOperation = testOperationFactory.Create(operation);
113113
if (!settings.RunWhenTestsFail && testOperation.FailedTests > 0)
114114
{
115-
await CombinedLogAsync($"Skipping coverage due to failed tests. Option {nameof(AppOptions.RunWhenTestsFail)} is false");
116-
await reportGeneratorUtil.EndOfCoverageRunAsync();
115+
CombinedLog($"Skipping coverage due to failed tests. Option {nameof(AppOptions.RunWhenTestsFail)} is false");
116+
reportGeneratorUtil.EndOfCoverageRun();
117117
return;
118118
}
119119

@@ -123,8 +123,8 @@ private async System.Threading.Tasks.Task TestExecutionFinishedAsync(IOperation
123123
{
124124
if (totalTests <= runWhenTestsExceed)
125125
{
126-
await CombinedLogAsync($"Skipping coverage as total tests ({totalTests}) <= {nameof(AppOptions.RunWhenTestsExceed)} ({runWhenTestsExceed})");
127-
await reportGeneratorUtil.EndOfCoverageRunAsync();
126+
CombinedLog($"Skipping coverage as total tests ({totalTests}) <= {nameof(AppOptions.RunWhenTestsExceed)} ({runWhenTestsExceed})");
127+
reportGeneratorUtil.EndOfCoverageRun();
128128
return;
129129
}
130130
}
@@ -133,43 +133,40 @@ private async System.Threading.Tasks.Task TestExecutionFinishedAsync(IOperation
133133
private bool cancelling;
134134
private void OperationState_StateChanged(object sender, OperationStateChangedEventArgs e)
135135
{
136-
RunAsync(async () =>
136+
try
137137
{
138-
try
138+
if (e.State == TestOperationStates.TestExecutionCanceling)
139139
{
140-
if (e.State == TestOperationStates.TestExecutionCanceling)
141-
{
142-
cancelling = true;
143-
await CombinedLogAsync("Test execution cancelling - running coverage will be cancelled.");
144-
await reportGeneratorUtil.EndOfCoverageRunAsync(); // not necessarily true but get desired result
145-
fccEngine.StopCoverage();
146-
}
147-
148-
149-
if (e.State == TestOperationStates.TestExecutionStarting)
150-
{
151-
await TestExecutionStartingAsync(e.Operation);
152-
cancelling = false;
153-
}
154-
155-
if (e.State == TestOperationStates.TestExecutionFinished)
156-
{
157-
await TestExecutionFinishedAsync(e.Operation);
158-
}
159-
160-
if (e.State == TestOperationStates.TestExecutionCancelAndFinished && !cancelling)
161-
{
162-
await CombinedLogAsync("There has been an issue running tests. See the Tests output window pane.");
163-
await reportGeneratorUtil.EndOfCoverageRunAsync(); // not necessarily true but get desired result
164-
fccEngine.StopCoverage();
165-
}
166-
140+
cancelling = true;
141+
CombinedLog("Test execution cancelling - running coverage will be cancelled.");
142+
reportGeneratorUtil.EndOfCoverageRun(); // not necessarily true but get desired result
143+
fccEngine.StopCoverage();
167144
}
168-
catch (Exception exception)
145+
146+
147+
if (e.State == TestOperationStates.TestExecutionStarting)
169148
{
170-
logger.Log("Error processing unit test events", exception);
149+
TestExecutionStarting(e.Operation);
150+
cancelling = false;
171151
}
172-
});
152+
153+
if (e.State == TestOperationStates.TestExecutionFinished)
154+
{
155+
TestExecutionFinished(e.Operation);
156+
}
157+
158+
if (e.State == TestOperationStates.TestExecutionCancelAndFinished && !cancelling)
159+
{
160+
CombinedLog("There has been an issue running tests. See the Tests output window pane.");
161+
reportGeneratorUtil.EndOfCoverageRun(); // not necessarily true but get desired result
162+
fccEngine.StopCoverage();
163+
}
164+
165+
}
166+
catch (Exception exception)
167+
{
168+
logger.Log("Error processing unit test events", exception);
169+
}
173170

174171
}
175172
}

SharedProject/Output/OutputToolWindowControl.xaml.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,13 @@ public void Handle(NewReportMessage message)
7373

7474
public void Handle(InvokeScriptMessage message)
7575
{
76-
InvokeScript(message.ScriptName, message.Arguments);
77-
}
76+
ThreadHelper.JoinableTaskFactory.Run(async () =>
77+
{
78+
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
79+
80+
InvokeScript(message.ScriptName, message.Arguments);
81+
});
82+
}
7883

7984
public void Handle(ObjectForScriptingMessage message)
8085
{

0 commit comments

Comments
 (0)