C#:WinForm表单挂在按钮单击上,有时在表单加载

时间:2017-06-29 20:27:46

标签: winforms timer .net-1.1 asynccallback form-load

我正在使用C#修改旧版Visual Studio .NET 2003解决方案和.NET 1.1。

我刚刚创建了一个新表单。这个表格有四个图片框。其中三个包含png图像,最后一个包含动画图像。还有一个标签。最后,根据某些条件(int结果)显示了一个按钮。

表单类如下所示:

private System.Threading.Timer _timer;

public delegate int GetPriceDelegate(Person person, out string resultMsg);
int GetPrice(Person person, out string resultMsg);


private void FrmPrices_Load(object sender, System.EventArgs e)
{       
            AsyncCallback callback = new AsyncCallback(PriceCallback);
            GetPriceDelegate handler = new GetPriceDelegate(Commons.GetPrice);
            handler.BeginInvoke(person, out resultMsg, callback, null);
}

private void PriceCallback(IAsyncResult result)
{
            GetPriceDelegate handler = (GetPriceDelegate) ((AsyncResult) result).AsyncDelegate;

            try
            {
                string resultMsg;
                int rs = handler.EndInvoke(out resultMsg, result);

                if (rs == 0)
                {

                    this.pictureBox.SendToBack();
                    this.pictureBox.Visible = false;

                    this.btnOk.BringToFront();
                    this.btnOk.Visible = true;

            System.Threading.TimerCallback callback = new System.Threading.TimerCallback(Timer_Callback);
            _timer = new System.Threading.Timer(callback, null, 10000, System.Threading.Timeout.Infinite);
                }
                else if (rs == -1)
                {
                }
                else
                {
                }
            }
            catch (Exception ex)
            {
                 // do something
            }
}


private void Timer_Callback(object state)
{
    this.Close();
}

private void btnOk_Click(object sender, System.EventArgs e)
{
    this.Close();
}


private void FrmPrices_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
     if (_timer != null)
     {
        _timer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
        _timer.Dispose();
     }
}

在另一个类Commons中,有GetPrice方法。此方法基本上调用Web服务并返回结果。

回调" PriceCallback"执行异步调用(方法的异步调用完成),我调用EndInvoke(...)并检查异步调用返回的结果。

如果结果为0(rs == 0),那么我发送回来并使图片框不可见并将其置于前面并使按钮可见。注意:在表单中,按钮位于图片框上方,但同时只显示其中一个(图片框或按钮)。最后,我创建一个计时器并启动它。

所以此时,表单显示标签(包含消息)和按钮(关闭表单)。此消息在10秒内显示。如果用户没有单击按钮关闭表单,则表单会在为计时器定义的10秒后自动关闭。

我的问题如下

  • 当表格显示标签和按钮(关闭表格)时,我无法点击按钮,似乎冻结了,因为它忽略了点击。此外,如果我尝试单击按钮,那么SO说流行的应用程序没有响应。如果显示表单时我没有点击按钮,我等到10秒钟后,表格会自动正确关闭。那么为什么按钮会忽略我的点击呢?据我所知,计时器不会阻止主UI线程,对吧?那么为什么按钮点击没有响应呢?
  • 当表单加载时通过调用ShowDialog()有时(并非总是)我得到以下错误消息: "无法从资源文件加载资源请检查您的设置"。

我拥有的唯一资源是4个图片框的四个图像,其中一个是动画图像。我不明白为什么有时会因为这个错误而崩溃,有时候不会崩溃。

关于这些问题的任何想法?

0 个答案:

没有答案