Pumping Windows Messages During Long Operation?

Related searches

I'm getting the following message on a big operation that I'm running:

The CLR has been unable to transition from COM context 0x1fe458 to COM context 0x1fe5c8 for 60 seconds. The thread that owns the destination context/apartment is most likely either doing a non pumping wait or processing a very long running operation without pumping Windows messages. This situation generally has a negative performance impact and may even lead to the application becoming non responsive or memory usage accumulating continually over time. To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations.

How do I send windows messages so that this error will no longer occur on long operations?

It's unclear exactly what the context is - are you performing some long-running task on the UI thread of a WinForms or WPF app? If so, don't do that - use BackgroundWorker, or run the task on the thread pool or a new thread directly (possibly using Control.Invoke/BeginInvoke or Dispatcher if you need to update the UI). If your big operation uses the COM component which is complaining, it'll be harder...

[Solved] Error in windows application: long running operation , a very long running operation without pumping Windows messages. This situation generally has a negative performance impact and may even� This is a Managed Debugging Assistant (MDA) warning. It is firing because you are conducting a long operation without allowing messages to pump. You can resolve this problem by pumping messages at the end of each pass through the loop. Typically you would do this by PInvoking the Win32 PeekMessage followed by the Win32 TranslateMessage and DispatchMessage function in a loop as follows

As I know this thing happens with attached debugger only. You will never get this exception in production.

Non pumping wait or processing a very long running operation , Microsoft Office for Developers. > You can resolve this problem by pumping messages at the end of each pass through the loop. On the other hand, processing messages during long operations can result in strange� a very long running operation without pumping Windows messages. This situation generally has a negative performance impact and may even lead to the application becoming non responsive or memory usage accumulating continually over time. To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as

I tend to use Application.DoEvents in these scenarios. I don't know whether that will work in your situation though. It requires a reference to System.Windows.Forms but will also work in Console Apps.

Alternatively you can try multi-threading your apps.

Pumping Windows Messages During Long Operation?, I'm getting the following message on a big operation that I'm running: The CLR has been unable to transition from COM context 0x1fe458 to COM context� To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations. How do I send windows messages so that this error will no longer occur on long operations?

If this happens inside a debugger it may be due to the ContextSwitchDeadlock MDA, which you can turn off (use the Exceptions window in Visual Studio). However, it is indicative of a larger problem -- you should not perform long-running operations on your UI thread.

Pumping Windows Messages During Long Operation?, use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations. How do I send windows� To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations. And here is the code that caused it:

The traditional win32 method is:

void PumpMessages()
{
    MSG msg;
    for( ;; ) {
        if( !PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) {
            return;
        }
        if( msg.message == WM_QUIT ) {
            s_stopped = true;
            return;
        }
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }
}

But I gather that you are using .NET.

Pump Messages During Long Operations, long running operations." So, in my C# loop (reading in a bunch of images) - how do I pump windows messages so that my application� The thread that owns the destination context/apartment is most likely either doing a non pumping wait or processing a very long running operation without pumping Windows messages. This situation generally has a negative performance impact and may even lead to the application becoming non responsive or memory usage accumulating continually over time.

pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations.

To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations. All I'm doing is this Dim DBConn1 As OleDbConnection Dim DBCommand1 As OleDbDataAdapter

Calling this method causes the current thread to be suspended while all waiting window messages are processed. If a message causes an event to be triggered, then other areas of your application code may execute. This can cause your application to exhibit unexpected behaviors that are difficult to debug.

Comments
  • any final solution with full source code ?
  • Yes, this is in a WinForm (sorry for not specifying that in the OP). I will try implementing this code in a background worker, thanks!
  • Finished implementing this, worked like a charm, thanks again!
  • @Jon Skeet Could you please elaborate on the COM component part? We have multiple threads accessing COM object and this leads to the OPs issue.
  • @odyodyodys: It sounds like we'll need more information about the COM component you're using - in particular, which threading model it uses.
  • I have a thread processing a large amount of data, while the UI waits for progress messages. It sounds like I am doing it right, yet the debugger throws this messages. What should I be doing in the UI thread while waiting for messages?
  • Indeed it doesn't since the message is produced by a VS debugger's snap-in. Still, this fact doesn't remove the underlying problem the message warns of.
  • Thanks, I too noticed that my debugger shows this warning even when my UI is completely responsive at that moment (I even have a progress bar for my background task which I run using Task.Run, and the progress bar is alive and being animated, but still this exception is shown by Visual Studio. Maybe in my case it has something to do with the fact that I'm using WebBrowser element on my Windows form...
  • Application.DoEvents is almost always the wrong solution here, IMO. There may be some edge cases where it's needed, but if it's just "I'm performing a long-running operation which really shouldn't be in the UI thread" then moving it off the UI thread is the right solution.
  • I agree entirely. I've not seen the error message recently, but I do vaguely recall that I've seen it not just on the UI thread. I think I've seen it on long running COM requests but I could be wrong.