gpt4 book ai didi

c# - 如何在 C# Async Task 中异步等待某个条件

转载 作者:行者123 更新时间:2023-11-30 20:41:22 26 4
gpt4 key购买 nike

我正在寻找一种简单有效的异步方式(等待/阻塞),而无需在 Async Task 方法中进行轮询。

我在下面创建了一个简单的伪代码情况:

private var queue = new ConcurrentQueue<Command>();

// Function called by program
public async Task<String> GetNameAsync(int id)
{
//Build Command
var Command = new Command(id);

//Enqueue Command to concurrent queue
queue.enqueue(command);

//Wait for command to finnish executing, posibly supply a timeout
await command.CompleteCondition

//Once command has completed or timed out return the result of the task.
return command.Response.getString();
}


//Continiously runs in its own thread
private void MainThread()
{
while(mustRun)
{
if(queue.Any())
{
//Get command from queue if there is one
var command = queue.dequeue();

//Execute command
var result = ExecuteCcommand(command);

//Set Command Done with result (so the blocking async task can continue:
//TODO:

}else{
Thread.Sleep(100);
}
}

我省略了我不知道的机制,但本质上我需要将某种锁连同命令一起传递给主线程,主线程将通知 Async Task 一旦它已完成,以便任务可以继续。

我确信一定有某种类型的 c# 机制,它专门设计用于 c# 异步任务库。我显然不知道它,也从未使用过它。你会推荐我使用什么?

最佳答案

最简单的方法是使用 TaskCompletionSource。例如:

public class Command
{
private readonly TaskCompletionSource<string> _tcs = new TaskCompletionSource<string>();

public Task<string> ExecuteAsync()
{
return _tcs.Task;
}

internal void ExecuteCommand()
{
if (_tcs.Task.IsCompleted) return;

try
{
// Do your work...

_tcs.SetResult(result);
}
catch (Exception ex)
{
_tcs.SetException(ex);
}
}
}

执行命令时,您只需var result = await ExecuteAsync();。在您的 worker 中,只需执行 ExecuteCommand();

关于c# - 如何在 C# Async Task 中异步等待某个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32455985/

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