完成我希望我的程序等待下面一行如何等待線程不會阻塞UI
frmProgressBarObj = PullMSI.ExtractByMSIName("products.txt", false);
如上述方法在內部調用通過StartProcessWithProgress線程()方法後。我希望線程在//代碼邏輯-2行被執行之前完成。同時,它不應該停止由frmProgressBar.UpdateProgress()完成UI更新。我該怎麼做呢?
namespace NS1
{
public partial class frmMain : Form
{
private void button1_Click(object sender, EventArgs e)
{
frmProgressBar frmProgressBarObj = PullMSI.ExtractByMSIName("products.txt", false);
//code logic - 2
MessageBox.Show("This is executing immediately.
I want to wait until above thread is complete");
}
}
public partial class frmProgressBar : Form
{
public void UpdateProgress(String strTextToDisplayOnProgress)
{
progressBar1.BeginInvoke(
new Action(() =>
{
progressBar1.Value++;
lblFileName.Text = strTextToDisplayOnProgress;
if (progressBar1.Value == progressBar1.Maximum)
{
this.Hide();
}
}));
}
public delegate void DelProgress();
public void StartProcessWithProgress(DelProgress delMethodCode, int maxCount)
{
InitializeProgress(maxCount);
Thread backgroundThread = new Thread(new ThreadStart(delMethodCode));
backgroundThread.Start();
}
}
public static class PullMSI
{
public static frmProgressBar ExtractByMSIName(String strProductFilePath, bool reNameMSI)
{
frmProgressBar frmProgressBar = new frmProgressBar();
frmProgressBar.StartProcessWithProgress(() =>
{
//StreamRader sr declaration and other code
while (!sr.EndOfStream)
{
//logic here
frmProgressBar.UpdateProgress("Copying sr.msiname");
}
}, 2);
return frmProgressBar;
}
}
}
UI?這是一個控制檯應用程序。 –
我的不好。對不起,爲了簡化代碼,我只是將所有類放在控制檯應用程序中,以便我可以輕鬆地在此處發佈。但它的Windows窗體應用程序和進程開始點擊按鈕。 – Akie
您可以使用以下兩種方法之一:1)TPL與任務繼續2)重置事件(ManualResetEventSlim/AutoResetEventSlim)3)使用其他機制,如信號量(高度阻止你這樣做)4)異步/等待,如果你正在運行。淨4.5+。 5)生產者/消費者(針對您的使用案例的過度使用)。基本上可以有多種方式。做一個閱讀這些,並選擇一個你最喜歡的。 – kha