【发布时间】:2016-01-07 01:00:22
【问题描述】:
我在 Google 上搜索了很多,并阅读了不同的新手教程,但我认为我不明白应该做什么。基本上,如果服务器启动并运行,则存在同步的现有代码。有时,很少,服务器需要更长的时间才能启动,所以我想将它包装在一些重试逻辑中。我构建了一个完全愚蠢的控制台应用程序来尝试了解 async 和 await 是如何工作的,然后想出了这个:
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
这样我应该将以前的同步方法异步转换吗?
编辑
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 Web 应用程序还是其他)?根据这些问题的答案,尤其是最后一个问题,我可能会提出不同的建议,或者您可能根本不关心异步。
-
您能否发布您的“真实”代码,以便我们了解它是如何实现异步的?
标签: c# asynchronous