C# Invoking causes Task never complete
c#, multithreading
Solution
Your `ReadCodes` method (which presumably executes on the UI thread) spawns a new task, and blocks to wait for it – the UI thread can do nothing else until it completes.
However, your task (which runs on the thread pool) calls `Invoke` to run an operation on the UI thread, also blocking until this completes. Since both operations are blocked waiting for each other, neither can proceed, resulting in a deadlock.
To resolve, the easiest solution is typically to replace your `Invoke` with `BeginInvoke`, allowing your task to proceed (and complete) without waiting for the UI update. Once the task does complete, the UI thread is freed, and processes the pending UI update.
Edit: In response to the question being updated to include a loop: I would suggest that you use the asynchronous pattern (introduced in C# 5). This would eliminate UI thread blocking altogether, and allow you to perform UI updates as soon as each line is processed.
public async Task ReadCodes()
{
foreach (var line in lines)
{
string text = await Task.Run(() =>
{
//foo code
// return text;
});
this.lblUsedFiles.Text = text;
}
//some other foo
}
Edit2: I've updated my code based on Peter Duniho's comment. Since `ReadCodes` is presumably called on the UI thread, you can update the UI directly within it (without needing `Invoke`) upon awaiting each task. I'm assuming that the background processing performed in `//some other codes` can be integrated into the subsequent iteration's `//foo code`.
Problem
This is my code: ``` public void ReadCodes(){ Task compute = Task.Run(() => { //foo code foreach (var line in lines) { //some other codes SetText("doing something"); } }); compute.Wait(); //some other foo } private void SetText(string text) { if (this.lblUsedFiles.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { text }); } else { this.lblUsedFiles.Text = text; } } ``` When I remove `SetText("doing something")` call `ReadCodes()` function works, otherwise it hangs. What's wrong with my code? I want to update UI inside `Task.Run()`.