异步写入文件

问题描述 投票:0回答:2

我在代码中实现异步方法时遇到了一个小问题,因为这是我第一次使用它。我在向文件写入数据时遇到了问题,当我将方法设置为同步时,它可以正常工作,但是,当使用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中的数据。

这是一个测试,文本文件应该包含这个信息。

任何帮助都将是非常感激的,谢谢!

c# .net asynchronous stream
2个回答
0
投票

如果这是一个控制台应用程序,那么我猜测你的 Main 方法没有返回一个 Task这意味着你的应用程序将在任务完成之前退出。

await 关键词将 返回 当它作用于不完整的 Task. 通常,它将返回自己的 Task 的方法,调用者可以用来等待它的完成。但如果该方法是 void,那么它就不能返回任何东西,也没有什么能够等待它。

所以如果你有这样的东西。

public static async void Main() {
    await WriteFile(path);
}

那么一旦向文件系统发出IO请求, WriteFile 将返回一个 Task那么 awaitMain 将一无所获(因为 Mainvoid),你的程序就会结束。

如果你至少使用C# 7.1,那么你可以返回一个叫做 TaskMain:

public static async Task Main() {
    await WriteFile(path);
}

而且.NET知道,它需要让应用程序继续运行,直到...。Task 是完整的。

如果你不能使用C#7.1,那么你最好使用同步代码。


-2
投票

将你的方法改为返回一个成功的条件。这将确保在函数退出之前运行完所有的代码。

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.