• 0

[C#] Updating a label in real-time without deadlocking form


Question

I have a while loop that updates the form, while the actual information for the form is updated in a separate thread. The problem is, it is designed like this currently:

		while (!quit) {
			this.SuspendLayout();
			this.BeginInvoke(new InvokeDelegate(UpdateForm));
			System.Threading.Thread.Sleep(1000);
			this.Update();
			this.ResumeLayout(true);
		}

UpdateForm just updates the Text properties of 2 labels and exits. I've tried a lot in the past few hours, but this while loop thing has got me... How do I prevent such a deadlock? I've tried various combinations of Threads, Invoke, BeginInvoke, and the like, and nothing has worked. I've went through several tutorials on the topics (all of which dealt with the console), and understood how things worked. I even created my own console app based on what I learned. Windows Forms is a completely different animal from console apps though... Can anybody help or provide suggestions? Note that this isn't homework (I can't imagine doing this for homework...); it is just being done in the pursuit of knowledge! :)

4 answers to this question

Recommended Posts

  • 0

Here, I am assuming the child thread is doing some job X.

The BeginInvoke code, should be called from within the child thread context, and not from within the main thread (which handles the UI). You don't need a while loop in the main thread to update the UI.

edit---

Something like this:

public class ThreadExample : Form {
	// The ThreadProc method is called when the thread starts.
	// It loops ten times, writing to the console and yielding 
	// the rest of its time slice each time, and then ends.
	public void ThreadProc() {
		for (int i = 0; i < 10; i++) {
			Console.WriteLine("ThreadProc: {0}", i);
			// Yield the rest of the time slice.
			Thread.Sleep(0);
			// do job X
			this.BeginInvoke(new InvokeDelegate(UpdateForm)); // update UI
		}
	}

	private void UpdateForm() {
	  // do form updating here
	}

	public ThreadExample() {
		Thread t = new Thread(new ThreadStart(ThreadProc));
		t.Start();
	}
}

Edited by g0wg
  • 0

Thanks, g0wg. After some manipulation, I was able to adapt it to my form. All of my ideas centered around using the main thread to update the UI while having a worker thread do its job that the UI relies on. You made it simple to understand - call BeginInvoke on the separate thread to update the UI, not the main thread. Thank you very much! :)

  • 0
  rpgfan said:
Thanks, g0wg. After some manipulation, I was able to adapt it to my form. All of my ideas centered around using the main thread to update the UI while having a worker thread do its job that the UI relies on. You made it simple to understand - call BeginInvoke on the separate thread to update the UI, not the main thread. Thank you very much! :)

You should probably learn why your previous attempt failed, too.

The Invoke() and BeginInvoke() methods work by posting a message to the UI thread of the control you call it on (the thread that owns the window and contains its message loop). Since you're calling this function from the UI thread, that message is sitting in the message queue for the thread you're currently running on. And since you are blocking that thread with your loop, its message loop will never be called and the message telling it to invoke your UpdateForm command will never be processed. In fact, you're just going to sit there filling up the message queue forever.

If you're new to Windows or UI programming, you should take the time to learn how windows (not Windows the OS, but "windows" the programming concept) work. Understanding window messages / window processes may not strictly be necessary for simple .NET programming, but it can certainly help prevent mistakes like this one.

  • 0
  Brandon Live said:
You should probably learn why your previous attempt failed, too.

The Invoke() and BeginInvoke() methods work by posting a message to the UI thread of the control you call it on (the thread that owns the window and contains its message loop). Since you're calling this function from the UI thread, that message is sitting in the message queue for the thread you're currently running on. And since you are blocking that thread with your loop, its message loop will never be called and the message telling it to invoke your UpdateForm command will never be processed. In fact, you're just going to sit there filling up the message queue forever.

If you're new to Windows or UI programming, you should take the time to learn how windows (not Windows the OS, but "windows" the programming concept) work. Understanding window messages / window processes may not strictly be necessary for simple .NET programming, but it can certainly help prevent mistakes like this one.

Thanks for the explanation, Brandon. Actually, I'm pretty decent at event-driven programming. I just wasn't thinking in an event-driven manner. I was doing too much object-oriented thinking (<sarcasm>because OOP solves all problems, right?</sarcasm> :)) and not enough intelligent thinking to realize that I was missing something so obvious. I am indeed new to UI programming, and that is probably another major reason why I didn't get it. I'm glad it was something fairly simple to resolve. Again, thanks to all that helped.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • The Synology DS923+ is down to $610 just for today on Newegg by Steven Parker Right now on Newegg, and only for today (June 26) you can find the Synology DS923+ discounted all the way down to $609.99 when using a coupon during checkout, down from it's normal $642.99 price. Although we haven't reviewed the DS923+ on Neowin, we have seen Synology before and rated it quite highly. Besides, the DS1522 even has the same AMD R1600 CPU. Some people would consider Synology homelab NAS equipment the "gold standard", and as such, competitors strive to do as good, at least in regard to the Operating System, DSM, which ticks all the boxes for amateurs, professionals and small business users for its inclusion of mobile apps for core app services such as Surveillance Station, and more. Here are the most important specifications: Synology DS923+ CPU AMD Ryzen R1600 2-core 2.6 (base) / 3.1 (turbo) GHz Graphics No Memory 4 GB DDR4 SODIMM, maximum 32 GB (16 GB x 2) Disk Capacity 72 TB (18TB x 4) RAID Level RAID 0, 1, 5, 6, 10, and JBOD + SHR (Synology Hybrid RAID) Network 2 x RJ-45 1 GbE Internal storage 2 x M.2 2280 NVMe Slot USB Ports 1 x USB 3.2 (5 Gbps) HDMI 1 x Expansion 1 x eSATA 1 x Gen3 x2 network upgrade slot Size (H/W/D) 166 mm x 199 mm x 223 mm Weight 2.24 kg Power 35.51 W (Access) 11.52 W (HDD Hibernation) What's in the box? Main Unit X 1 Accessory Pack X 1 AC Power Adapter X 1 AC Power Cord X 1 RJ-45 LAN Cable X 2 Quick Installation Guide X 1 You may notice that the DS923+ does not have integrated graphics, which is a step down from earlier Intel-based models that did include an iGPU. However, even this year's model (the DS925+) does not include an iGPU with its slightly newer AMD Ryzen Embedded V1500B CPU, but also unhelpfully locks down what you can use in it. All 2025 models require hardware from Synology's own compatibility list, this currently does not affect the DS923+. In addition you are only getting dual 1 GB Ethernet with the DS923+, so you may need to factor in the cost of adding the 10 GbE PCIe network card, which sells for $110.99 on Newegg. Ultimately, deciding on a NAS device comes to down to your individual requirements. For example, more bays is not always better, especially once you factor in the price of hard drives. Those with more modest storage requirements may be better off with a 2-bay device. From my personal experience, DSM 7.2 is great, it's so great that I have installed it on my TerraMaster F4-424 Max. Finally, and perhaps more importantly many tinkerers would prefer building their own server which is definitely a cheaper option, but without the polish of a dedicated NAS. If you have no need to transcode video on the fly and want a four bay NAS device, then the DS923+ is a great solution for every other use case and I can highly recommend it. Synology DS923+ for $609.99 on Newegg (was $642.99) Enter coupon code SACET2369 for above price during checkout
    • I don't think it's childish, but I do think it would be ineffective. If I was addicted to social media I would just disable the extension when I wanted to visit the certain sites.
    • Did you copy SuperHands's post and just reword it 🤣
    • Not what I was expecting. I thought it was going to add ray tracing to games that don't support it or something lol.
    • Looks less buggy than FC25. I still don't understand how they managed to release that game.
  • Recent Achievements

    • Conversation Starter
      Kavin25 earned a badge
      Conversation Starter
    • One Month Later
      Leonard grant earned a badge
      One Month Later
    • Week One Done
      pcdoctorsnet earned a badge
      Week One Done
    • Rising Star
      Phillip0web went up a rank
      Rising Star
    • One Month Later
      Epaminombas earned a badge
      One Month Later
  • Popular Contributors

    1. 1
      +primortal
      529
    2. 2
      ATLien_0
      205
    3. 3
      +FloatingFatMan
      168
    4. 4
      Michael Scrip
      150
    5. 5
      snowy owl
      126
  • Tell a friend

    Love Neowin? Tell a friend!