gpt4 book ai didi

c# - 异步写入文件

转载 作者:IT王子 更新时间:2023-10-29 04:38:19 27 4
gpt4 key购买 nike

有什么方法可以编写一个异步函数,将数据重复写入文件。

当我写异步函数时出现以下错误

该进程无法访问文件 'c:\Temp\Data.txt',因为它正被另一个进程使用

public void GoButton_Click(object sender, System.EventArgs e)
{
IAsyncResult ar = DoSomethingAsync(strURL, strInput);
Session["result"] = ar;
Response.Redirect("wait1.aspx");
}

private IAsyncResult DoSomethingAsync(string strURL, string strInput)
{
DoSomethingDelegate doSomethingDelegate = new DoSomethingDelegate(DoSomething);
IAsyncResult ar = doSomethingDelegate.BeginInvoke(strURL, strInput, new AsyncCallback(MyCallback), null);
return ar;
}

private delegate void DoSomethingDelegate(string strURL, string strInput);

private void MyCallback(IAsyncResult ar)
{
AsyncResult aResult = (AsyncResult)ar;
DoSomethingDelegate doSomethingDelegate = (DoSomethingDelegate)aResult.AsyncDelegate;
doSomethingDelegate.EndInvoke(ar);
}

private void DoSomething(string strURL, string strInput)
{
int i = 0;
for (i = 0; i < 1000; i++)
{
m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
m_streamWriter.WriteLine("{0} ", MethodCall(strURL, strInput));
m_streamWriter.Flush();
m_streamWriter.Close();
}
}

最佳答案

我也遇到了同样的问题。现在解决了。这是一种迟到的建议,但可能对其他人有帮助。

在下面的控制台示例中包含以下 using 语句。

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
Use of the FileStream Class

下面的例子使用了 FileStream 类,它有一个选项可以导致在操作系统级别发生异步 I/O。在许多情况下,这将避免阻塞 ThreadPool 线程。要启用此选项,您必须在构造函数调用中指定 useAsync=true 或 options=FileOptions.Asynchronous 参数。

StreamReader和StreamWriter如果直接指定文件路径打开则没有这个选项。如果您向 StreamReader/Writer 提供由 FileStream 类打开的 Stream,则它们确实有此选项。请注意,异步在 UI 应用程序中提供响应优势,即使线程池线程被阻塞,因为 UI 线程在等待期间不会被阻塞。

编写文本

以下示例将文本写入文件。在每个 await 语句中,该方法立即退出。当文件 I/O 完成时,该方法会在 await 语句之后的语句处继续执行。请注意,async 修饰符位于使用 await 语句的方法的定义中。

static void Main(string[] args)
{
ProcessWrite().Wait();
Console.Write("Done ");
Console.ReadKey();
}

static Task ProcessWrite()
{
string filePath = @"c:\temp2\temp2.txt";
string text = "Hello World\r\n";

return WriteTextAsync(filePath, text);
}

static async Task WriteTextAsync(string filePath, string text)
{
byte[] encodedText = Encoding.Unicode.GetBytes(text);

using (FileStream sourceStream = new FileStream(filePath,
FileMode.Append, FileAccess.Write, FileShare.None,
bufferSize: 4096, useAsync: true))
{
await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
};
}

阅读文本

以下示例从文件中读取文本。文本被缓冲,在本例中,被放入 StringBuilder 中。与前面的示例不同,await 的计算会产生一个值。 ReadAsync 方法返回一个 Task,因此对 await 的计算会产生一个 Int32 值 (numRead),该值会在操作完成后返回。

static void Main(string[] args)
{
ProcessRead().Wait();
Console.Write("Done ");
Console.ReadKey();
}

static async Task ProcessRead()
{
string filePath = @"c:\temp2\temp2.txt";

if (File.Exists(filePath) == false)
{
Console.WriteLine("file not found: " + filePath);
}
else {
try {
string text = await ReadTextAsync(filePath);
Console.WriteLine(text);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}

static async Task<string> ReadTextAsync(string filePath)
{
using (FileStream sourceStream = new FileStream(filePath,
FileMode.Open, FileAccess.Read, FileShare.Read,
bufferSize: 4096, useAsync: true))
{
StringBuilder sb = new StringBuilder();

byte[] buffer = new byte[0x1000];
int numRead;
while ((numRead = await sourceStream.ReadAsync(buffer, 0, buffer.Length)) != 0)
{
string text = Encoding.Unicode.GetString(buffer, 0, numRead);
sb.Append(text);
}

return sb.ToString();
}
}

原始来源是 here但不幸的是,该链接现在似乎已失效。

可以找到新的来源here .

希望对您有所帮助...

关于c# - 异步写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11774827/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com