C # Заставить программу завершить процессы перед продвижением - PullRequest
0 голосов
/ 01 декабря 2011

В C # как заставить программу обрабатывать только одну вещь за раз?Я работал над системой исправлений, и я думаю, что у меня все кодирование правильное, но я не могу его проверить, потому что многие функции пытаются обрабатывать все сразу, когда они должны быть обработаны в заказе.Программа даже не позволяет отображаться дисплею, прежде чем она попытается все обработать.Поскольку ни один из них не возвращает значение, отличное от функции main, для всех функций установлено значение void.Я подумал, может быть, использовать возвращаемое значение внутри цикла, чтобы убедиться, что программа закончила с этим шагом сначала, прежде чем двигаться дальше, но это все еще оставляет проблему программы даже не отображаемой, пока не будет завершена обработка, которая должна показатьпрогресс всего.Любые предложения советов?

Редактировать: я не знаю, что размещать в коде, поэтому я публикую все основные функции:

    public void DSP_Load(object sender, EventArgs e)
    {
        if (v1 >= v2)
        {
            File_Progress_Title.Text = "100%";
            Update_Status.Text = "Divine Shadows is currently up to date.";
            Application.DoEvents();
            Process.Start("Divine Shadows.exe");
            Close();
        }
        else
        {
            Update_Status.Text = "Checking For Updates...";
            Application.DoEvents();

            if (!Directory.Exists(tempFilePath))
            {
                Directory.CreateDirectory(tempFilePath);
            }

            using (SqlCon = new MySqlConnection(connString))
            {
                SqlCon.Open();
                string command = "SELECT * FROM version where version > '" + v1 + "' ORDER BY version LIMIT 1";
                MySqlCommand GetLatestVersion = new MySqlCommand(command, SqlCon);

                using (MySqlDataReader DR = GetLatestVersion.ExecuteReader())
                {
                    while(DR.Read())
                    {
                        do
                        {
                            string LatestVersion = Convert.ToString(DR.GetValue(1));
                            string WebURL = Convert.ToString(DR.GetValue(2));
                            update.DownloadFileAsync(new Uri(WebURL), tempFilePath + "patch" + LatestVersion + ".zip");
                            update.DownloadProgressChanged += new DownloadProgressChangedEventHandler(download);
                            update.DownloadFileCompleted += new AsyncCompletedEventHandler(extration);
                            Application.Restart();
                        }
                        while (v1 < v2);
                        Process.Start("Divine Shadows.exe");
                        Close();
                    }
                }
            }
        }
    }

    public void download(object sender, DownloadProgressChangedEventArgs e)
    {
        if (v1 >= v2)
        {
            File_Progress_Title.Text = "100%";
            Update_Status.Text = "Divine Shadows is currently up to date.";
            Application.DoEvents();
            Process.Start("Divine Shadows.exe");
            Close();
        }
        else
        {
            Update_Status.Text = "Downloading Updates...";
            Application.DoEvents();
            File_Progress_Display.Value = e.ProgressPercentage;
            File_Progress_Title.Text = Convert.ToString(e.ProgressPercentage) + "%";
        }
    }

    public void extration(object sender, AsyncCompletedEventArgs e)
    {
        if (v1 >= v2)
        {
            File_Progress_Title.Text = "100%";
            Update_Status.Text = "Divine Shadows is currently up to date.";
            Application.DoEvents();
            Process.Start("Divine Shadows.exe");
            Close();
        }
        else
        {
            Update_Status.Text = "Installing Updates, Please Wait...";
            Application.DoEvents();
            UnzipFile(extactFile, extractLocation);
        }
    }

    public static void UnzipFile(string extactFile, string extractLocation)
    {
        try
        {
            FastZip fastZip = new FastZip();
            fastZip.CreateEmptyDirectories = false;
            fastZip.ExtractZip(extactFile, extractLocation, FastZip.Overwrite.Always, null, null, null, false); 
        }
        catch (Exception ex)
        {
            throw new Exception("Error unzipping file \"" + extactFile + "\"", ex);
        }
        File.Delete(extactFile);
    }

Ответы [ 2 ]

0 голосов
/ 01 декабря 2011

Если вы используете c # 4 или новее, вы можете использовать параллельную библиотеку задач для асинхронного выполнения задач, оставляя, таким образом, ваш ответ пользовательского интерфейса во время загрузки.Прежде всего, вам нужна ссылка:

using System.Threading.Tasks;

и код:

public void YourMainFunction()
{
    var urls = new List<string>();
    urls.Add("http://google.com");
    urls.Add("http://yahoo.com");

    foreach(var url in urls)
    {
        Task.Factory.StartNew<DownloadResult>(() => 
             DownloadIt(url))
             .ContinueWith(WorkDone, TaskScheduler.FromCurrentSynchronizationContext());
    }
}

private class DownloadResult
{
    public string Url {get; set;}
    public string Result {get; set;}
}

private DownloadResult DownloadIt(string url)
{
    var downloadResult = new DownloadResult{ Url = url };
    var client = new WebClient();
    downloadResult.Result = client.DownloadString(url);
    return downloadResult;
}

private void WorkDone(Task<DownloadResult> task)
{
    if(task.IsFaulted)
    {
        //An exception was thrown 
        MessageBox.Show(task.Exception.ToString());
        return;
    }

    //Everything went well
    var downloadResult = task.Result;
    //Here you can update your UI to reflect progress.
    MessageBox.Show(downloadResult.Result);

}
0 голосов
/ 01 декабря 2011

Ваша проблема не связана с WebClient (), она связана с тем, как ваше приложение работает с потоками.

В общем, приложения winforms имеют один поток GUI.Этот поток используется для выполнения ваших методов, а также для обновления пользовательского интерфейса.Если вы запустите длительный процесс, поток графического интерфейса будет заблокирован до завершения операции.Вот почему ваш дисплей не отображается.

Вы можете решить эту проблему, внедрив BackgroundWorker .На этом сайте вы также можете найти пример, как это реализовать.Позвольте BackgroundWorker выполнить ваш процесс исправления и использовать события внутри метода BackgroundWorker.RunWorkerAsync () для обновления вашего графического интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...