有没有办法编写一个异步函数,重复地将数据写入文件。
我在编写异步函数时遇到以下错误
进程无法访问文件'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();
}
}
7条答案
按热度按时间ebdffaop1#
嗯,我也有同样的问题。现在解决了。这是一个很晚的建议,但可能对其他人有帮助。
在下面的控制台示例中包括以下using语句。
下面的示例使用FileStream类,该类具有一个选项,可导致在操作系统级别发生异步I/O。在许多情况下,这将避免阻塞ThreadPool线程。若要启用此选项,必须在构造函数调用中指定useAsync=true或options=FileOptions.Asynchronous参数。
如果通过指定文件路径直接打开StreamReader和StreamWriter,则它们不具有此选项。如果向StreamReader/Writer提供由FileStream类打开的Stream,则它们具有此选项。请注意,即使线程池线程被阻止,异步也会在UI应用程序中提供响应优势,因为UI线程在等待期间不会被阻止。
书写文本
以下示例将文本写入文件。在每个await语句中,该方法立即退出。当文件I/O完成时,该方法在await语句后面的语句中继续。请注意,异步修饰符位于使用await语句的方法的定义中。
阅读文本
下面的示例从文件读取文本。文本被缓冲,在本例中,文本被放入StringBuilder中。与上一示例不同的是,对await的求值将生成一个值。ReadAsync方法返回一个Task,因此对await的求值将生成一个Int 32值(numRead),该值将在操作完成后返回。
原始源代码是here,但不幸的是,链接现在似乎死了。
可以在here中找到新的源代码。
希望能有所帮助...
vawmfj5a2#
处理异步写入文件的帮助器方法示例。
1tu0hz3e3#
异步写入文件不能解决此问题。您需要等待文件可用。
ocebsuys4#
如果你使用一个简单的StreamWriter,你可以用一个简单的类来代替它。不需要async/await。这是一个写文本文件的例子。
要使用它,请像使用StreamWriter一样操作:
6xfqseft5#
可接受的答案有一个常见的异步陷阱-缓冲区不是异步刷新的。https://github.com/davidfowl/AspNetCoreDiagnosticScenarios/blob/master/AsyncGuidance.md#always-call-flushasync-on-streamwriters-or-streams-before-calling-dispose
使用新的
await using
或在处理之前手动刷新缓冲区或
hwamh0ep6#
简单明了的解决方案:
e0uiprwp7#
最终,这取决于你为什么要这么做。
如果您不打算向文件写入太多数据,则可以不断地打开和关闭它。
或者,如果您知道何时要打开文件,何时要关闭文件,则可以在需要时打开它,然后保持打开状态以进行写入,直到您知道不再需要它为止。