Я много гулял и читал разные учебники noob, но я не думаю, что понимаю, что нужно делать. В основном существует существующий код, который является синхронным, что делает что-то, если сервер запущен и работает. Иногда, очень редко, сервер занимает больше времени, поэтому я хотел бы включить его в некоторую логику повтора. Я построил совершенно глупое приложение консоли, чтобы попытаться понять, как асинхронные и жду работать немного и придумал это:Изменение синхронного метода для async
private static int counter = 0;
static void Main(string[] args)
{
DoIt();
Console.ReadLine();
}
static bool LongTask()
{
if (counter == 2)
{
Console.WriteLine("finally true");
Thread.Sleep(1000);
return true;
}
counter++;
Console.WriteLine("false");
Thread.Sleep(1000);
return false;
}
public static Task<bool> WrapperLongTask()
{
Console.WriteLine("wrapper called");
return Task.Run(() => LongTask());
}
public static async Task DoIt()
{
Console.WriteLine("hi");
var result = await WrapperLongTask();
while (result != true)
{
result = await WrapperLongTask();
Console.WriteLine("inside while loop");
}
Console.WriteLine($"outside while loop {result}");
Console.WriteLine("bye");
}
Моей функция LongTask будет представлять свою текущую функцию, которая делает работу, которая обычно работает в первый раз. Это нормально практика затем вызвать этот метод с
Task.Run(() => LongTask())
Если предположить, что это «нормально», то я бы в принципе создать это в моем фактический код для моего текущего метода DoWork()
.
Task DoWorkAsync(....) {
return Task.Run(() => DoWork()
}
В основном просто обернуть его в Task.Run, изменив тип возврата на Task. Затем, когда я называю этот метод позже, я хотел бы сделать что-то вроде
var x = await DoWorkAsync;
// do more stuff with x
Это способ, которым я должен преобразовать предыдущий метод синхронизации асинхр? Заранее спасибо.
Edit:
псевдо-код для DoWork (каталог строка, CancellationToken маркер)
var files = Directory.GetFiles(directory, "*", SearchOption.AllDirectories);
foreach (var file in files) {
try {
token.ThrowIfCancellationRequested();
var fileName = Path.GetFileName(file);
// check if file already exists on server, if not, upload it
}
catch (Exception exception) {
// error handling
}
}
Что это «делает что-то»? Вам нужно ждать результатов до того, как сервер сделает что-нибудь еще? Призывает ли он какие-либо методы, имеющие асинхронные эквиваленты? Что еще делает сервер? (Это веб-приложение ASP.NET или что-то еще)? В зависимости от того, какие ответы на эти вопросы, в частности последний, я могу посоветовать по-другому или, возможно, вы вообще не беспокоитесь о асинхронности. –
Не могли бы вы разместить свой «настоящий» код, чтобы мы могли видеть, как он может быть асинхронным? –