Как перезагрузить функцию, если ее выполнение превышает определенное время в C#? - PullRequest
1 голос
/ 01 марта 2020

Я пытаюсь случайным образом сгенерировать судоку размером n.

Следовательно, я написал функцию: generateSudoku(int blocksize)

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

Я думаю, что есть вероятность 50% сгенерировать ложное судоку 2x2, и когда она не удалась, функция запускается бесконечно .

Так что я хотел бы знать, есть ли в C# некоторые функции, которые обнаруживают, что данная функция превышает определенное время выполнения , и существуют ли некоторые функции, которые могут перезагрузить функцию .

Например, я хотел бы, чтобы в моем коде было что-то подобное:

while ( generateSudoku(int blocksize).Time() > threshold ){
      generateSudoku(int blocksize).Reload()
}

Я знаю, что писать это абсолютно неправильно, но я не знаю, как это объяснить. лучше.

Вы можете мне помочь? Любые подсказки или предложения?

Заранее спасибо!

1 Ответ

1 голос
/ 01 марта 2020

Этого можно добиться с помощью потоков или любого вида асинхронной логики c. Эффективно то, что вы ищете, это готовый код для контроля вашего выполнения и другой для выполнения вашей работы.

Если вы можете изменить функцию, используйте asyn c, например: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/cancel-async-tasks-after-a-period-of-time

private async void MonitorCalculation(object sender, RoutedEventArgs e)
{
    // Instantiate the CancellationTokenSource.
    cts = new CancellationTokenSource();

    try
    {
        // ***Set up the CancellationTokenSource to cancel after 2.5 seconds. (You
        // can adjust the time.)
        cts.CancelAfter(2500);
         // I'm assuming this is your function that calculates time
        await CalculateTime(cts.Token);
    }
    catch (OperationCanceledException)
    {
        // "\r\nDownloads canceled.\r\n";
    }
    catch (Exception)
    {
        // "\r\nDownloads failed.\r\n";
    }

    cts = null;
}

Затем в OperationCancelledException вы можете повторить или вернуть переменную, указывающую, что вам следует снова вызвать функцию asyn c.

Если вы не можете изменить расчет на asyn c, тогда вы можете попробовать класс TaskFactory.

...