gpt4 book ai didi

C# 异步 : How does a thread remember its local variables?

转载 作者:太空宇宙 更新时间:2023-11-03 20:51:19 25 4
gpt4 key购买 nike

在多线程中,线程共享一些东西,但不是局部变量。每个线程都维护自己的存储局部变量的堆栈副本。很好,但是在这种情况下会发生什么?

public async Task<string> ReadFile()
{
var fileName = GenerateFileName();

using (var reader = File.OpenText(fileName))
{
var fileText = await reader.ReadToEndAsync();
return fileName + "|" + fileText;
}
}

当IO操作开始时,线程进入休眠状态(或做其他事情),当它(或其他)返回继续执行函数时,它如何记住fileName的值>?堆栈在这里发生了什么?

最佳答案

它的发生方式与 yield 类似。方法存储它们的局部变量:它创建一个 struct具有 C# 中的局部变量作为字段。

所以你的代码会产生一些东西如果 aysnc不存在必须像这样编码:

private struct ReadFileAsyncStateMachine : IAsyncStateMachine
{
public int _state;
public AsyncTaskMethodBuilder<string> _builder;
private string _fileName;
private string _fileText;
private StreamReader _reader;
TaskAwaiter<string> _awaiter;
void IAsyncStateMachine.MoveNext()
{
try
{
if (_state != 0)
{
goto afterSetup;
}

_fileName = GenerateFileName();
_reader = File.OpenText(_fileName);
TaskAwaiter<string> awaiter = _reader.ReadToEndAsync().GetAwaiter();
_state = -1;
if (!awaiter.IsCompleted)
{
_awaiter = awaiter;
_builder.AwaitUnsafeOnCompleted<TaskAwaiter<string>, ReadFileAsyncStateMachine>(ref awaiter, ref this);
return;
}

afterSetup:
awaiter = _awaiter;
_fileText = awaiter.GetResult();
_state = -2;
_builder.SetResult(_fileName + "|" + _fileText);
_reader.Dispose();
}
catch (Exception exception)
{
_state = -2;
_builder.SetException(exception);
_reader?.Dispose();
return;
}
}
[DebuggerHidden]
void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine param0)
{
_builder.SetStateMachine(param0);
}
}

public Task<string> ReadFile()
{
ReadFileAsyncStateMachine stateMachine = new ReadFileAsyncStateMachine();
AsyncTaskMethodBuilder<string> builder = AsyncTaskMethodBuilder<string>.Create();

stateMachine._builder = builder;
stateMachine._state = -1;
builder.Start(ref stateMachine);
return builder.Task;
}

ReadFileAsyncStateMachine处理 ReadToEndAsync() 的可能性立即完成,在这种情况下 Task<string>返回立即完成并有结果,或正在运行,在这种情况下 Task<string> returned 本身正在运行,后续调用将发生在 MoveNext() 上这将完成它。异常也被处理。

如您所见,C# 中的局部变量是实现中的字段。

关于C# 异步 : How does a thread remember its local variables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54941894/

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