我一直在寻找我的特定问题的答案,但没有成功。
我的程序中有一个任务需要几秒钟,我想在完成任务时显示一个新表单。新表单有一个加载栏和一些文本。
我需要显示与任务平行的新表单,否则任务将无法启动,直到我关闭新表单。
这是我现在的解决方案:
private void loadingBar()
{
frmLoading frm = new frmLoading("Please wait while the database is being backed up", "This might take several days.");
frm.ShowDialog();
}
public void Backup()
{
Thread load = new Thread(new ThreadStart(loadingBar));
load.Start();
///Execute a task.
load.Abort();
}
所以,这个工作正常但我的问题是:在加载线程中关闭“frm”形式以使其停止会不会更好?
答案 0 :(得分:2)
你可以通过几种方式做到这一点......
1 - 你可以像BendEg建议的那样做,并在准备好后调用你frmClose
喜欢的东西;
Invoke(new Action(Close));
或
Invoke(new Action(() => frmMain.Close()));
2 - 或者你可以简单地使用后台工作者;
最简单的方法是向表单添加BackgroundWorker,并使用提供的事件;
public Form1()
{
InitializeComponent();
backgroundWorker1.RunWorkerAsync();
MessageBox.Show(@"Please wait while the database is being backed up", @"This might take several days.");
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
Debug.WriteLine("Running"); //Execute a task
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Debug.WriteLine("Ended"); //Dispose of any objects you'd like (close yor form etc.)
}
我希望这会有所帮助。
答案 1 :(得分:1)
您可以在Class-Level上声明表单,然后使用调用将其关闭。 MSDN-Windows Forms Invoke
像这样:
public class Class1
{
private Form myForm;
public Class1()
{
myForm = new Form();
}
public void DoSomeWork()
{
// ===================================================
// Do Some Work...
// ===================================================
myForm.Invoke(new MethodInvoker(this.Hide));
}
public void Hide()
{
myForm.Hide();
}
public void Backup()
{
myForm.ShowDialog();
Thread load = new Thread(new ThreadStart(DoSomeWork));
load.Start();
}
}
答案 2 :(得分:1)
我认为这对你有用。
void YourMethod()
{
WaitForm wf = new WaitForm();
Invoke(new PleaseWaitDelegate(Launch),wf);
bool val = BoolMethodDoWork();
Invoke(new PleaseWaitDelegate(Close), wf);
if(val)
{
MessageBox.Show("Success!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
return;
}
MessageBox.Show("Damn!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
}
delegate void PleaseWaitDelegate(Form form);
void Launch(Form form)
{
new System.Threading.Thread(()=> form. ShowDialog()).Start();
}
void Close(Form form)
{
form.Close();
}
答案 3 :(得分:0)
我认为这会对你有帮助(如果我理解你的话):
Parallel.Invoke(() => somemethod(), () =>
{
someothertaskmethod();
});
我将方法作为示例来演示正在运行的2个任务。
您需要使用正确的使用声明using System.Threading.Tasks;