Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使我的启动屏幕根据文件下载时间开始和结束?_C#_.net_Winforms - Fatal编程技术网

C# 如何使我的启动屏幕根据文件下载时间开始和结束?

C# 如何使我的启动屏幕根据文件下载时间开始和结束?,c#,.net,winforms,C#,.net,Winforms,在我的form1构造函数中,我有: while (splash_flag == true) { splash.Show(); Thread.Sleep(3000); splash_flag = false; } if (splash_flag == false) { spl

在我的form1构造函数中,我有:

while (splash_flag == true)
            {
                splash.Show();
                Thread.Sleep(3000);
                splash_flag = false;
            }
            if (splash_flag == false)
            {

                splash.Close();
            }
            fileDownloadRadar(remote_image_on_server,combinedTemp);
这是fileDownloadRadar方法:

HttpWebRequest request;
        void fileDownloadRadar(string uri, string fileName)
        {
            request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(uri);
            request.CookieContainer = new CookieContainer();
            request.AllowAutoRedirect = true;

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            if (response.ContentType == "")
            {
                Logger.Write("ContentType is Empty download was not fine !!!!!");
            }
            if ((response.StatusCode == HttpStatusCode.OK ||
                response.StatusCode == HttpStatusCode.Moved ||
                response.StatusCode == HttpStatusCode.Redirect) &&
                response.ContentType.StartsWith("image", StringComparison.OrdinalIgnoreCase))
            {
                Logger.Write("ContentType is not empty meaning download is fine");
                using (Stream inputStream = response.GetResponseStream())
                using (Stream outputStream = File.OpenWrite(fileName))
                {
                    byte[] buffer = new byte[4096];
                    int bytesRead;
                    do
                    {
                        bytesRead = inputStream.Read(buffer, 0, buffer.Length);
                        outputStream.Write(buffer, 0, bytesRead);
                    } while (bytesRead != 0);

                }
                FinishWebRequest();
            }
            else
            {
                timer1.Stop();
                timer3.Start();
            }
        }
现在它的工作方式启动屏幕等待3秒关闭,然后表单加载

但我希望启动屏幕将在下载文件开始时启动,并在下载完成后关闭,然后加载表单

FinishWebRequest方法是下载文件的位置。喜欢完整的下载


我的问题是如何计算时间,或者如何使启动屏幕从文件下载开始,完成后关闭?

启动屏幕和下载必须在不同的线程中运行。您可以创建新线程,也可以切换到使用异步下载方法

无论哪种方式,我都会使用一个(我猜它可以保留名称)而不是一个
splash\u标志。它将在重置状态下启动。
FinishWebRequest()
方法将调用
splash\u flag.Set()
(或您决定命名它的任何名称)。这将触发启动屏幕关闭。您可以将while循环替换为以下简单内容:

splash.Show();
splash_flag.WaitOne();
splash.Close();
splash\u flag.WaitOne()
将挂起,直到
FinishWebRequest()
调用
splash\u flag.Set()

编辑:因为您的启动屏幕必须设置动画。你只需要投票就可以了。在UI线程中有一个循环将导致窗体没有响应

您可以创建一个计时器来进行轮询:

splash.Show();
// Poll every 100ms. Change as desired.
var timer = new System.Timers.Timer(100) { AutoReset = true };
timer.Elapsed += (s, e) =>
    {
        if (splash_flag.WaitOne(0)) // Check for signal and return without blocking
        {
            // Use Invoke() so you only deal with the form in the UI thread
            splash.Invoke(new Action(() => { splash.Close(); }));
            timer.Stop();
        }
    }
timer.Start();

这不会导致一个没有响应的启动屏幕吗?当它卡在WaitOne()上时,它如何重新绘制?…如果下载需要一段时间,您可能会得到一个“白色输出”。您没有提到您的启动屏幕是动画的。我已经更新了我的答案来解决这个问题。