Ожидайте, пока процесс не заканчивается

Независимо от использования QueryTable, вы можете открывать онлайн-файлы прямо из Excel. Ниже приведен пример того, как сгенерировать URL на основе ввода даты и открыть его из Excel.

Option Explicit

Private Const DATE_FMT As String = "yyyymmdd"
Private Const BASE_URL As String = "https://docs.misoenergy.org/marketreports/"
Private Const POSTFIX1 As String = "_sr_nd_is.xls"
Private Const POSTFIX2 As String = "_rt_lmp_final.csv"

Sub Main()
    Dim dDataDate As Date, dToday As Date, oWB As Workbook

    dToday = CDate(ThisWorkbook.Sheets(1).Cells(6, 1).Value) ' Not sure what to do with this
    dDataDate = CDate(ThisWorkbook.Sheets(1).Cells(1, 1).Value) - 1 ' 1 day before it

    Set oWB = GetOnlineFile(CreateURL1(dDataDate))

    If Not oWB Is Nothing Then
        ' Do whatever you need with the opened file

        oWB.Close
        Set oWB = Nothing
    End If
End Sub

Private Function GetOnlineFile(URL As String) As Workbook
    On Error Resume Next
    Set GetOnlineFile = Workbooks.Open(URL)
End Function

Private Function CreateURL1(DataDate As Date) As String
    CreateURL1 = BASE_URL & Format(DataDate, DATE_FMT) & POSTFIX1
End Function

Private Function CreateURL2(DataDate As Date) As String
    CreateURL2 = BASE_URL & Format(DataDate, DATE_FMT) & POSTFIX2
End Function
194
задан rory.ap 8 January 2018 в 07:46
поделиться

6 ответов

Думаю, вам просто нужно вот это:

Process.Start(...);
Process.WaitForExit();

См. Метод на странице MSDN . У него также есть перегрузка, в которой вы можете указать тайм-аут, поэтому вы не можете ждать вечно.

384
ответ дан 23 November 2019 в 05:22
поделиться

Что касается примера Microsoft: [ https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.enableraisingevents? view=netframework-4.8]

Лучший должен был бы установить:

myProcess.EnableRaisingEvents = true;

otherwiese Код будет заблокирован. Также никакие дополнительные свойства не необходимы.

// Start a process and raise an event when done.
myProcess.StartInfo.FileName = fileName;
// Allows to raise event when the process is finished
myProcess.EnableRaisingEvents = true;
// Eventhandler wich fires when exited
myProcess.Exited += new EventHandler(myProcess_Exited);
// Starts the process
myProcess.Start();

// Handle Exited event and display process information.
private void myProcess_Exited(object sender, System.EventArgs e)
{
Console.WriteLine(
                  $"Exit time    : {myProcess.ExitTime}\n" +
                  $"Exit code    : {myProcess.ExitCode}\n" +
                  $"Elapsed time : {elapsedTime}");
}
1
ответ дан 23 November 2019 в 05:22
поделиться

Использовать Process.WaitForExit ? Или подписаться на событие Process.Exited , если не хотите блокировать? Если это не дает того, что вы хотите, дайте нам дополнительную информацию о ваших требованиях.

132
ответ дан 23 November 2019 в 05:22
поделиться

В своем приложении я делаю следующее:

Process process = new Process();
process.StartInfo.FileName = executable;
process.StartInfo.Arguments = arguments;
process.StartInfo.ErrorDialog = true;
process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
process.Start();
process.WaitForExit(1000 * 60 * 5);    // Wait up to five minutes.

В нем есть несколько дополнительных функций, которые могут оказаться полезными ...

35
ответ дан 23 November 2019 в 05:22
поделиться

Вы можете использовать ожидание выхода или перехватить свойство HasExited и обновить свой пользовательский интерфейс, чтобы пользователь был «информирован» (управление ожиданием):

System.Diagnostics.Process process = System.Diagnostics.Process.Start("cmd.exe");
while (!process.HasExited)
{
    //update UI
}
//done
16
ответ дан 23 November 2019 в 05:22
поделиться

Я думаю, что Process.WaitForExit должно быть именно тем, что вы ищете.

6
ответ дан 23 November 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: