Click here to Skip to main content
15,885,278 members
Home / Discussions / C#
   

C#

 
GeneralRe: Sum columns from joined tables to get a calculated value using linq to SQL Pin
Member 1246241117-Jul-17 12:15
Member 1246241117-Jul-17 12:15 
GeneralRe: Sum columns from joined tables to get a calculated value using linq to SQL Pin
Mycroft Holmes17-Jul-17 14:18
professionalMycroft Holmes17-Jul-17 14:18 
GeneralRe: Sum columns from joined tables to get a calculated value using linq to SQL Pin
Richard Deeming18-Jul-17 0:38
mveRichard Deeming18-Jul-17 0:38 
AnswerRe: Sum columns from joined tables to get a calculated value using linq to SQL Pin
Member 1246241118-Jul-17 10:56
Member 1246241118-Jul-17 10:56 
QuestionWriting to UI Thread in a Real time Application Pin
andycruce16-Jul-17 2:41
andycruce16-Jul-17 2:41 
AnswerRe: Writing to UI Thread in a Real time Application Pin
Gerry Schmitz16-Jul-17 4:49
mveGerry Schmitz16-Jul-17 4:49 
AnswerRe: Writing to UI Thread in a Real time Application Pin
Dave Kreskowiak16-Jul-17 5:28
mveDave Kreskowiak16-Jul-17 5:28 
AnswerRe: Writing to UI Thread in a Real time Application Pin
Alan N16-Jul-17 8:31
Alan N16-Jul-17 8:31 
The BackgroundWorker (BGW) uses a WindowFormsSynchronizationContext (SC) to invoke the completed and progress events on the UI thread. The SC comes from the thread that calls the RunWorkerAsync method.

A non UI thread typically has no SC and then the BGW operates what is sometimes called the "free threaded model" using a ThreadPool thread to fire the completed and progress events.

A BGW started from a new thread will behave properly if the thread is given the UI thread's SC.

Some example code, I hope the missing bits are obvious.
C#
private void StartFromThreadWithContext_Click(Object sender, EventArgs e) {
  log.WriteLine("UI thread {0}", Thread.CurrentThread.ManagedThreadId);
  Thread starterThread = new Thread(StarterThreadProc);
  starterThread.Start(SynchronizationContext.Current);
}

private void StarterThreadProc(Object context) {
  log.WriteLine("Starting BGW from thread {0}", Thread.CurrentThread.ManagedThreadId);
  WindowsFormsSynchronizationContext wfsc = context as WindowsFormsSynchronizationContext;
  if (wfsc != null) {
    SynchronizationContext.SetSynchronizationContext(wfsc);  // THE IMPORTANT BIT!!
  }
  log.WriteLine("Thread has {0}", SynchronizationContext.Current);
  worker.RunWorkerAsync();
}

private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
  log.WriteLine("RunWorkerCompleted thread {0}", Thread.CurrentThread.ManagedThreadId);
}

private void Worker_DoWork(object sender, DoWorkEventArgs e) {
  log.WriteLine("DoWork thread {0}", Thread.CurrentThread.ManagedThreadId);
  Thread.Sleep(300);
}

Output to the log shows correct invocation of the completed event
UI thread 10
Starting BGW from thread 12
Thread has System.Windows.Forms.WindowsFormsSynchronizationContext
DoWork thread 7
RunWorkerCompleted thread 10

Alan.
SuggestionRe: Writing to UI Thread in a Real time Application Pin
BenScharbach12-Aug-17 10:17
BenScharbach12-Aug-17 10:17 
QuestionPaste CF_ENHMETAFILE=14 image file Pin
manuellopes14-Jul-17 11:32
manuellopes14-Jul-17 11:32 
SuggestionRe: Paste CF_ENHMETAFILE=14 image file Pin
Richard MacCutchan14-Jul-17 20:35
mveRichard MacCutchan14-Jul-17 20:35 
GeneralRe: Paste CF_ENHMETAFILE=14 image file Pin
manuellopes15-Jul-17 6:08
manuellopes15-Jul-17 6:08 
GeneralRe: Paste CF_ENHMETAFILE=14 image file Pin
Richard MacCutchan15-Jul-17 6:22
mveRichard MacCutchan15-Jul-17 6:22 
GeneralRe: Paste CF_ENHMETAFILE=14 image file Pin
manuellopes15-Jul-17 6:33
manuellopes15-Jul-17 6:33 
GeneralRe: Paste CF_ENHMETAFILE=14 image file Pin
Richard MacCutchan15-Jul-17 6:53
mveRichard MacCutchan15-Jul-17 6:53 
GeneralRe: Paste CF_ENHMETAFILE=14 image file Pin
manuellopes15-Jul-17 7:38
manuellopes15-Jul-17 7:38 
GeneralRe: Paste CF_ENHMETAFILE=14 image file Pin
Richard MacCutchan15-Jul-17 20:30
mveRichard MacCutchan15-Jul-17 20:30 
QuestionServicePointManager and TLS1.2 with Gmail Pin
jkirkerx13-Jul-17 6:34
professionaljkirkerx13-Jul-17 6:34 
AnswerServicePoint, Address = 'smtpClient.ServicePoint.Address' threw an exception of type 'System.NotSupportedException', Pin
jkirkerx13-Jul-17 8:45
professionaljkirkerx13-Jul-17 8:45 
GeneralRe: ServicePoint, Address = 'smtpClient.ServicePoint.Address' threw an exception of type 'System.NotSupportedException', Pin
Richard Deeming13-Jul-17 9:52
mveRichard Deeming13-Jul-17 9:52 
GeneralRe: ServicePoint, Address = 'smtpClient.ServicePoint.Address' threw an exception of type 'System.NotSupportedException', Pin
jkirkerx13-Jul-17 11:38
professionaljkirkerx13-Jul-17 11:38 
GeneralRe: ServicePoint, Address = 'smtpClient.ServicePoint.Address' threw an exception of type 'System.NotSupportedException', Pin
jkirkerx13-Jul-17 12:14
professionaljkirkerx13-Jul-17 12:14 
Questionhye :) Pin
Member 1330557812-Jul-17 17:24
Member 1330557812-Jul-17 17:24 
AnswerRe: hye :) Pin
OriginalGriff12-Jul-17 20:23
mveOriginalGriff12-Jul-17 20:23 
GeneralRe: hye :) Pin
Member 1330557812-Jul-17 22:14
Member 1330557812-Jul-17 22:14 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.