每个.Net框架的最低操作系统要求是什么?例如,哪个版本无法运行每个操作系统:
我相信所有.Net框架都与XP,Vista,Windows Server 2003和Windows Server 2008兼容(如果错误,请纠正我).
我们试图测量使用同步方法和异步读取一系列文件之间的性能.期望在两者之间大约有相同的时间但是使用异步的速度大约慢5.5倍.
这可能是由于管理线程的开销,但只是想了解您的意见.也许我们只是在测量时间错误.
这些是正在测试的方法:
static void ReadAllFile(string filename)
{
var content = File.ReadAllBytes(filename);
}
static async Task ReadAllFileAsync(string filename)
{
using (var file = File.OpenRead(filename))
{
using (var ms = new MemoryStream())
{
byte[] buff = new byte[file.Length];
await file.ReadAsync(buff, 0, (int)file.Length);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是运行它们并启动秒表的方法:
static void Test(string name, Func<string, Task> gettask, int count)
{
Stopwatch sw = new Stopwatch();
Task[] tasks = new Task[count];
sw.Start();
for (int i = 0; i < count; i++)
{
string filename = "file" …Run Code Online (Sandbox Code Playgroud) 我正在使用以下C#代码通过网络共享读取一个小文本文件:
string fileContent;
using (var stream = File.OpenRead(filePath))
using (var reader = new StreamReader(stream, FileEncoding))
{
fileContent = await reader.ReadToEndAsync();
}
Run Code Online (Sandbox Code Playgroud)
即使文本文件非常小(小于10 KB),此操作有时需要约7秒才能运行.当发生这种情况时,我注意到大部分时间花在了上面
File.OpenRead(filePath)
Run Code Online (Sandbox Code Playgroud)
这可能是由于Windows必须解析文件共享并通过网络获取文件上的锁定.由于该方法调用不是异步的,因此阻止我当前的线程几秒钟.
是否有一种安全的方法可以异步读取磁盘中的文件,同时异步执行OpenRead?
我是异步编程的新手。我的用户界面中有一个按钮和文本框。我想单击该按钮,它将使用 FileStream.ReadAsync 方法读取文件,然后它应该在文本框中显示文件的结果。问题是我不想在读取文件时阻止我的 UI。我认为使用 Read 方法应该这样做。但它不起作用。此方法有什么不正确以及如何将 Read 更改为 ReadAsync?
private void Button_Click(object sender, RoutedEventArgs e)
{
string filename = @"D:\Log\log.txt";
byte[] result;
UnicodeEncoding uniencoding = new UnicodeEncoding();
using (FileStream SourceStream = File.Open(filename, FileMode.Open))
{
result = new byte[SourceStream.Length];
Task<int> tf = new Task<int>(()=> SourceStream.Read(result, 0, (int)SourceStream.Length));
tf.ContinueWith((x) =>
{
try
{
string txt = Encoding.ASCII.GetString(result);
Dispatcher.BeginInvoke((Action)(() => txtBox.Text = txt));
}
catch (Exception ae)
{
MessageBox.Show(ae.Message);
}
});
tf.Start();
}
Run Code Online (Sandbox Code Playgroud) 请看这段代码:
class Program
{
static async void DoStuff()
{
StreamWriter s = new StreamWriter("a.txt");
WebClient wc = new WebClient();
await wc.DownloadStringTaskAsync(new Uri("http://www.microsoft.com")); //1
//await s.WriteAsync ("123"); //2
Thread.Sleep(10000);
Console.WriteLine("DoStuffEnd");
}
static void Main(string[] args)
{
Program.DoStuff();
Console.WriteLine("MainEnd");
Console.Read();
}
}
Run Code Online (Sandbox Code Playgroud)
根据async/await的逻辑,在这种情况下一切正常.
输出:
MainEnd
10秒后
DoStuffEnd
但如果我评论(1)和取消注释(2),输出是:
10秒后
DoStuffEnd
MainEnd
为什么?
c# ×4
async-await ×3
asynchronous ×3
.net ×1
.net-4.5 ×1
file ×1
file-io ×1
task ×1
windows ×1