Skip to content

Commit 31fd5cd

Browse files
committed
Changed BackgroundWorkers in Project to async await
1 parent 3096fa9 commit 31fd5cd

File tree

4 files changed

+62
-109
lines changed

4 files changed

+62
-109
lines changed

Diff for: Glyssen/MainForm.cs

+8
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,14 @@ private void SetProject(Project project)
185185
}
186186

187187
private void FinishSetProjectIfReady(object sender, EventArgs e)
188+
{
189+
if (InvokeRequired)
190+
Invoke(new Action(FinishSetProjectIfReady));
191+
else
192+
FinishSetProjectIfReady();
193+
}
194+
195+
private void FinishSetProjectIfReady()
188196
{
189197
if (m_project != null && (m_project.ProjectState & ProjectState.ReadyForUserInteraction) > 0)
190198
FinishSetProject();

Diff for: GlyssenEngine/Project.cs

+44-90
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ public void SetQuoteSystem(QuoteSystemStatus status, QuoteSystem system)
328328
if (IsQuoteSystemReadyForParse && ProjectState == ProjectState.NeedsQuoteSystemConfirmation)
329329
{
330330
m_quoteSystem = system;
331-
DoQuoteParse();
331+
DoQuoteParseAsync();
332332
}
333333
else if ((quoteSystemChanged && !quoteSystemBeingSetForFirstTime) ||
334334
(QuoteSystemStatus == QuoteSystemStatus.Reviewed &&
@@ -1344,7 +1344,7 @@ private void InitializeLoadedProject()
13441344
m_usxPercentComplete = 100;
13451345
if (QuoteSystem == null)
13461346
{
1347-
GuessAtQuoteSystem();
1347+
GuessAtQuoteSystemAsync();
13481348
UpdateControlFileVersion();
13491349
return;
13501350
}
@@ -1463,55 +1463,38 @@ private void ParseAndSetBooks(IEnumerable<UsxDocument> books, IStylesheet styles
14631463
ParseAndIncludeBooks(books, stylesheet);
14641464
}
14651465

1466-
private void ParseAndIncludeBooks(IEnumerable<UsxDocument> books, IStylesheet stylesheet, Action<BookScript> postParseAction = null)
1466+
private async Task ParseAndIncludeBooks(IEnumerable<UsxDocument> books, IStylesheet stylesheet, Action<BookScript> postParseAction = null)
14671467
{
14681468
if (Versification == null)
14691469
throw new NullReferenceException("What!!!");
14701470
ProjectState = ProjectState.Initial | (ProjectState & ProjectState.WritingSystemRecoveryInProcess);
1471-
var usxWorker = new BackgroundWorker {WorkerReportsProgress = true};
1472-
usxWorker.DoWork += UsxWorker_DoWork;
1473-
usxWorker.RunWorkerCompleted += UsxWorker_RunWorkerCompleted;
1474-
usxWorker.ProgressChanged += UsxWorker_ProgressChanged;
1475-
1476-
object[] parameters = {books, stylesheet, postParseAction};
1477-
usxWorker.RunWorkerAsync(parameters);
1471+
await Task.Run(() => {UsxParse(books, stylesheet, postParseAction);});
14781472
}
14791473

1480-
private void UsxWorker_DoWork(object sender, DoWorkEventArgs e)
1474+
private void UsxParse(IEnumerable<UsxDocument> books, IStylesheet stylesheet, Action<BookScript> postParseAction = null)
14811475
{
1482-
var parameters = (object[])e.Argument;
1483-
var books = (IEnumerable<UsxDocument>)parameters[0];
1484-
var stylesheet = (IStylesheet)parameters[1];
1485-
var postParseAction = parameters.Length > 2 ? (Action<BookScript>)parameters[2] : null;
1486-
1487-
var backgroundWorker = (BackgroundWorker)sender;
1488-
1489-
var parsedBooks = UsxParser.ParseBooks(books, stylesheet, i => backgroundWorker.ReportProgress(i));
1476+
var parsedBooks = UsxParser.ParseBooks(books, stylesheet, i =>
1477+
{
1478+
m_usxPercentComplete = i;
1479+
var pe = new ProgressChangedEventArgs(PercentInitialized, null);
1480+
OnReport(pe);
1481+
});
14901482

14911483
if (postParseAction != null)
14921484
{
14931485
foreach (var book in parsedBooks)
14941486
postParseAction(book);
14951487
}
1496-
e.Result = parsedBooks;
1497-
}
1498-
1499-
private void UsxWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
1500-
{
1501-
if (e.Error != null)
1502-
throw e.Error;
1503-
1504-
var bookScripts = (List<BookScript>)e.Result;
15051488

1506-
foreach (var bookScript in bookScripts)
1489+
foreach (var bookScript in parsedBooks)
15071490
{
15081491
// This code is an attempt to figure out how we are getting null reference exceptions when using the objects in the list (See PG-275 & PG-287)
15091492
if (bookScript?.BookId == null)
15101493
{
1511-
var nonNullBookScripts = bookScripts.Where(b => b != null).Select(b => b.BookId);
1494+
var nonNullBookScripts = parsedBooks.Where(b => b != null).Select(b => b.BookId);
15121495
var nonNullBookScriptsStr = Join(";", nonNullBookScripts);
15131496
var initialMessage = bookScript == null ? "BookScript is null." : "BookScript has null BookId.";
1514-
throw new ApplicationException($"{initialMessage} Number of BookScripts: {bookScripts.Count}. " +
1497+
throw new ApplicationException($"{initialMessage} Number of BookScripts: {parsedBooks.Count}. " +
15151498
$"BookScripts which are NOT null: {nonNullBookScriptsStr}");
15161499
}
15171500

@@ -1520,12 +1503,12 @@ private void UsxWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEvent
15201503

15211504
if (m_books.Any())
15221505
{
1523-
foreach (var book in bookScripts)
1506+
foreach (var book in parsedBooks)
15241507
IncludeExistingBook(book);
15251508
}
15261509
else
15271510
{
1528-
m_books.AddRange(bookScripts);
1511+
m_books.AddRange(parsedBooks);
15291512
m_projectMetadata.ParserVersion = kParserVersion;
15301513
if (m_books.All(b => IsNullOrEmpty(b.PageHeader)))
15311514
ChapterAnnouncementStyle = ChapterAnnouncement.ChapterLabel;
@@ -1535,79 +1518,57 @@ private void UsxWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEvent
15351518
}
15361519

15371520
if (QuoteSystem == null)
1538-
GuessAtQuoteSystem();
1521+
GuessAtQuoteSystemAsync();
15391522
else if (IsQuoteSystemReadyForParse)
1540-
DoQuoteParse(bookScripts.Select(b => b.BookId));
1523+
DoQuoteParseAsync(parsedBooks.Select(b => b.BookId));
15411524
}
15421525

1543-
private void UsxWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
1544-
{
1545-
m_usxPercentComplete = e.ProgressPercentage;
1546-
var pe = new ProgressChangedEventArgs(PercentInitialized, null);
1547-
OnReport(pe);
1548-
}
1549-
1550-
private void GuessAtQuoteSystem()
1526+
private async Task GuessAtQuoteSystemAsync()
15511527
{
15521528
ProjectState = ProjectState.UsxComplete | (ProjectState & ProjectState.WritingSystemRecoveryInProcess);
1553-
var guessWorker = new BackgroundWorker {WorkerReportsProgress = true};
1554-
guessWorker.DoWork += GuessWorker_DoWork;
1555-
guessWorker.RunWorkerCompleted += GuessWorker_RunWorkerCompleted;
1556-
guessWorker.ProgressChanged += GuessWorker_ProgressChanged;
1557-
guessWorker.RunWorkerAsync();
1529+
await Task.Run(GuessAtQuoteSystem);
15581530
}
15591531

1560-
private void GuessWorker_DoWork(object sender, DoWorkEventArgs e)
1561-
{
1562-
e.Result = QuoteSystemGuesser.Guess(ControlCharacterVerseData.Singleton, m_books, Versification, out _,
1563-
sender as BackgroundWorker);
1564-
}
1565-
1566-
private void GuessWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
1532+
private void GuessAtQuoteSystem()
15671533
{
1568-
if (e.Error != null)
1569-
throw e.Error;
1570-
1571-
SetQuoteSystem(QuoteSystemStatus.Guessed, (QuoteSystem)e.Result);
1534+
var quoteSystem = QuoteSystemGuesser.Guess(ControlCharacterVerseData.Singleton, m_books, Versification, out _,
1535+
i =>
1536+
{
1537+
m_guessPercentComplete = i;
1538+
var pe = new ProgressChangedEventArgs(PercentInitialized, null);
1539+
OnReport(pe);
1540+
});
15721541

1542+
SetQuoteSystem(QuoteSystemStatus.Guessed, quoteSystem);
15731543
Save();
15741544
}
15751545

1576-
private void GuessWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
1577-
{
1578-
m_guessPercentComplete = e.ProgressPercentage;
1579-
var pe = new ProgressChangedEventArgs(PercentInitialized, null);
1580-
OnReport(pe);
1581-
}
1582-
1583-
private void DoQuoteParse(IEnumerable<string> booksToParse = null)
1546+
private async Task DoQuoteParseAsync(IEnumerable<string> booksToParse = null)
15841547
{
15851548
m_projectMetadata.ParserVersion = kParserVersion;
15861549
ProjectState = ProjectState.Parsing;
1587-
var quoteWorker = new BackgroundWorker {WorkerReportsProgress = true};
1588-
quoteWorker.DoWork += QuoteWorker_DoWork;
1589-
quoteWorker.RunWorkerCompleted += QuoteWorker_RunWorkerCompleted;
1590-
quoteWorker.ProgressChanged += QuoteWorker_ProgressChanged;
1591-
object[] parameters = {booksToParse};
1592-
quoteWorker.RunWorkerAsync(parameters);
1593-
}
1594-
1595-
private void QuoteWorker_DoWork(object sender, DoWorkEventArgs e)
1596-
{
1597-
var bookIds = (IEnumerable<string>)((object[])e.Argument)[0];
1598-
QuoteParser.ParseProject(this, sender as BackgroundWorker, bookIds);
1550+
await Task.Run(() => { DoQuoteParse(booksToParse);});
15991551
}
16001552

1601-
private void QuoteWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
1553+
private void DoQuoteParse(IEnumerable<string> bookIds)
16021554
{
1603-
if (e.Error != null)
1555+
try
1556+
{
1557+
QuoteParser.ParseProject(this, i =>
1558+
{
1559+
m_quotePercentComplete = i;
1560+
var pe = new ProgressChangedEventArgs(PercentInitialized, null);
1561+
OnReport(pe);
1562+
}, bookIds);
1563+
}
1564+
catch (Exception e)
16041565
{
16051566
#if DEBUG
16061567
Exception innerException;
1607-
if ((innerException = e.Error?.InnerException) != null)
1568+
if ((innerException = e.InnerException) != null)
16081569
Debug.WriteLine(innerException.Message + innerException.StackTrace);
16091570
#endif
1610-
throw e.Error;
1571+
throw;
16111572
}
16121573

16131574
ProjectState = ProjectState.QuoteParseComplete;
@@ -1628,13 +1589,6 @@ private void QuoteWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEve
16281589
QuoteParseCompleted?.Invoke(this, new EventArgs());
16291590
}
16301591

1631-
private void QuoteWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
1632-
{
1633-
m_quotePercentComplete = e.ProgressPercentage;
1634-
var pe = new ProgressChangedEventArgs(PercentInitialized, null);
1635-
OnReport(pe);
1636-
}
1637-
16381592
public int MaxProjectNameLength => Writer.GetMaxProjectNameLength(this);
16391593

16401594
public BookScript LoadExistingBookIfPossible(string bookId)

Diff for: GlyssenEngine/Quote/QuoteParser.cs

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections.Concurrent;
33
using System.Collections.Generic;
4-
using System.ComponentModel;
54
using System.Diagnostics;
65
using System.Globalization;
76
using System.Linq;
@@ -21,7 +20,7 @@ namespace GlyssenEngine.Quote
2120
{
2221
public class QuoteParser
2322
{
24-
public static void ParseProject(Project project, BackgroundWorker projectWorker, IEnumerable<string> bookIdsToParse)
23+
public static void ParseProject(Project project, Action<int> reportProgress, IEnumerable<string> bookIdsToParse)
2524
{
2625
var cvInfo = new ParserCharacterRepository(new CombinedCharacterVerseData(project), project.ReferenceText);
2726

@@ -43,10 +42,10 @@ public static void ParseProject(Project project, BackgroundWorker projectWorker,
4342
{
4443
book.Blocks = new QuoteParser(cvInfo, book.BookId, blocksInBook[book], project.Versification).Parse().ToList();
4544
completedProjectBlocks += numBlocksPerBook[book.BookId];
46-
projectWorker.ReportProgress(MathUtilities.Percent(completedProjectBlocks, allProjectBlocks, 99));
45+
reportProgress(MathUtilities.Percent(completedProjectBlocks, allProjectBlocks, 99));
4746
});
4847

49-
projectWorker.ReportProgress(100);
48+
reportProgress(100);
5049
}
5150

5251
public static void SetQuoteSystem(QuoteSystem quoteSystem)

Diff for: GlyssenEngine/Quote/QuoteSystemGuesser.cs

+7-15
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
using System;
44
using System.Collections.Generic;
5-
using System.ComponentModel;
65
using System.Diagnostics;
76
using System.Linq;
87
using Glyssen.Shared;
@@ -37,13 +36,13 @@ private static void IncrementScore(Dictionary<QuoteSystem, int> scores, QuoteSys
3736
bestScore = scores[quoteSystem];
3837
}
3938

40-
public static QuoteSystem Guess<T>(ICharacterVerseInfo cvInfo, List<T> bookList, ScrVers versification, out bool certain, BackgroundWorker worker = null) where T : IScrBook
39+
public static QuoteSystem Guess<T>(ICharacterVerseInfo cvInfo, List<T> bookList, ScrVers versification, out bool certain, Action<int> reportProgress = null) where T : IScrBook
4140
{
4241
certain = false;
4342
var bookCount = bookList.Count;
4443
if (bookCount == 0)
4544
{
46-
ReportProgressComplete(worker);
45+
reportProgress?.Invoke(100);
4746
return QuoteSystem.Default;
4847
}
4948
var scores = QuoteSystem.UniquelyGuessableSystems.ToDictionary(s => s, s => 0);
@@ -73,8 +72,7 @@ public static QuoteSystem Guess<T>(ICharacterVerseInfo cvInfo, List<T> bookList,
7372
var bookNum = bookTuple.Item1;
7473
var book = bookTuple.Item2;
7574

76-
if (worker != null)
77-
worker.ReportProgress(MathUtilities.Percent(++booksProcessed, bookCount));
75+
reportProgress?.Invoke(MathUtilities.Percent(++booksProcessed, bookCount));
7876

7977
int versesAnalyzedForCurrentBook = 0;
8078
int prevQuoteChapter = -1;
@@ -209,7 +207,7 @@ public static QuoteSystem Guess<T>(ICharacterVerseInfo cvInfo, List<T> bookList,
209207
if (competitors.Count == 1)
210208
{
211209
certain = true;
212-
ReportProgressComplete(worker);
210+
reportProgress?.Invoke(100);
213211
return competitors[0];
214212
}
215213

@@ -297,7 +295,7 @@ public static QuoteSystem Guess<T>(ICharacterVerseInfo cvInfo, List<T> bookList,
297295

298296
if (competitors.Any())
299297
{
300-
ReportProgressComplete(worker);
298+
reportProgress?.Invoke(100);
301299

302300
if (competitors.Count == 1)
303301
return competitors[0];
@@ -327,15 +325,15 @@ public static QuoteSystem Guess<T>(ICharacterVerseInfo cvInfo, List<T> bookList,
327325
#if SHOWTESTINFO
328326
Debug.WriteLine("Time-out guessing quote system.");
329327
#endif
330-
ReportProgressComplete(worker);
328+
reportProgress?.Invoke(100);
331329
return BestGuess(viableSystems, scores, bestScore, foundEndQuote);
332330
}
333331

334332
prevQuoteChapter = quote.Chapter;
335333
prevQuoteVerse = quote.Verse;
336334
}
337335
}
338-
ReportProgressComplete(worker);
336+
reportProgress?.Invoke(100);
339337
return BestGuess(viableSystems, scores, bestScore, foundEndQuote);
340338
}
341339

@@ -427,11 +425,5 @@ private static QuoteSystem BestGuess(IEnumerable<QuoteSystem> viableSystems, Dic
427425
// newSystem.AllLevels.Add(QuoteUtils.GenerateLevel3(newSystem, true));
428426
// return newSystem;
429427
//}
430-
431-
private static void ReportProgressComplete(BackgroundWorker worker)
432-
{
433-
if (worker != null)
434-
worker.ReportProgress(100);
435-
}
436428
}
437429
}

0 commit comments

Comments
 (0)