开箱太晚了

时间:2014-04-08 14:07:15

标签: c# winforms

我想通过从网上获取内容来显示“正在加载..,请稍候”。 我尝试了以下代码,但Picturebox打开太晚了。

private void buttonStart_Click(object sender, EventArgs e)
{
    pictureBox1.Visible = true;

    webSatList = new WebSatelliteList(this, XMLSatList, name);

    webSatList.LoadTPList();
    TPListToBeAdded = webSatList.GetTPListToBeAdded();
    TPListToBeRemoved = webSatList.GetTPListToBeRemoved();

    drawTPListGridView(TPListToBeAdded, TPListToBeRemoved);
}

public void drawTPListGridView(List<TPInfo> TPListToBeAdded, List<TPInfo> TPListToBeRemoved)
{
    pictureBox1.Visible = false;        
    //draw TP List ..
}

Picturebox在此行之后开放:

  

“TPListToBeRemoved = webSatList.GetTPListToBeRemoved();”

我试图通过使用backgroundworker(以下代码)解决此问题,并且已经看到了同样的问题。另外,我使用弹出窗体而不是PictureBox没有任何改变。

private void buttonStart_Click(object sender, EventArgs e)
{
    pictureBox1.Visible = true;

    backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
    backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
    backgroundWorker1.RunWorkerAsync();

}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    webSatList = new WebSatelliteList(this, XMLSatList, name);

    webSatList.LoadTPList();
    TPListToBeAdded = webSatList.GetTPListToBeAdded();
    TPListToBeRemoved = webSatList.GetTPListToBeRemoved();
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    drawTPListGridView(TPListToBeAdded, TPListToBeRemoved);
}

public void drawTPListGridView(List<TPInfo> TPListToBeAdded, List<TPInfo> TPListToBeRemoved)
{
    pictureBox1.Visible = false;        
    //draw TP List ..
}

我该如何解决这个问题?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

完全确定您在此处尝试做什么,但您可能希望实施async / await模式。

将按钮标记为async

private async void buttonStart_Click(object sender, EventArgs e)

对于您需要等待的任何内容,应该await并且它会重新绘制您的表单,因此它不会冻结。例如,像:

await Task.Run(() => loadPictureBox());

或者您可以通过为其设置async Task的签名来使您的loadpicturebox方法异步。

您可能遇到的问题是,在点击方法退出之前,表单不会更新或刷新。这意味着如果您首先使其显示加载图像,然后在相同方法中加载下一个图像,表单将冻结,直到两个操作都完成并且方法已退出。

async await模式意味着在进行某些处理或其他任何操作时,让窗口继续绘制表格并对其进行处理。