我在代码中实现异步方法时遇到了一个小问题,因为这是我第一次使用它。我在向文件写入数据时遇到了问题,当我将方法设置为同步时,它可以正常工作,但是,当使用async时,什么都不会发生。
这是我目前使用的代码。
static async Task WriteFile()
{
string path = $@"C:\Users\{Environment.UserName}\FileToWrite.js";
if (File.Exists(path))
{
try
{
string value;
using (StreamReader reader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("AsyncTest.Resources.data.txt")))
{
value = await reader.ReadToEndAsync();
}
using (StreamWriter writer = new StreamWriter(path))
{
await writer.WriteAsync(value);
}
}
catch
{
Debug.WriteLine("Error writing to file.");
}
}
}
我是这样调用这个方法的
await WriteFile(path);
Resources.data.txt中的数据。
这是一个测试,文本文件应该包含这个信息。
任何帮助都将是非常感激的,谢谢!
如果这是一个控制台应用程序,那么我猜测你的 Main
方法没有返回一个 Task
这意味着你的应用程序将在任务完成之前退出。
在 await
关键词将 返回 当它作用于不完整的 Task
. 通常,它将返回自己的 Task
的方法,调用者可以用来等待它的完成。但如果该方法是 void
,那么它就不能返回任何东西,也没有什么能够等待它。
所以如果你有这样的东西。
public static async void Main() {
await WriteFile(path);
}
那么一旦向文件系统发出IO请求, WriteFile
将返回一个 Task
那么 await
在 Main
将一无所获(因为 Main
是 void
),你的程序就会结束。
如果你至少使用C# 7.1,那么你可以返回一个叫做 Task
从 Main
:
public static async Task Main() {
await WriteFile(path);
}
而且.NET知道,它需要让应用程序继续运行,直到...。Task
是完整的。
如果你不能使用C#7.1,那么你最好使用同步代码。
将你的方法改为返回一个成功的条件。这将确保在函数退出之前运行完所有的代码。
static async Task<bool> WriteFile(string path)
{
if (File.Exists(path))
{
string value = "";
try
{
using (StreamReader reader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("AsyncTest.Resources.data.txt")))
{
value = await reader.ReadToEndAsync();
}
}
catch
{
Debug.WriteLine("Error opening resource.");
return false;
}
try
{
using (StreamWriter writer = new StreamWriter(path))
{
await writer.WriteAsync(value);
}
}
catch
{
Debug.WriteLine("Error writing to file.");
return false;
}
return true;
}
Debug.WriteLine("Error file does not exist.");
return false;
}