gpt4 book ai didi

C# 如何在命令行应用程序中使用异步方法运行线程

转载 作者:行者123 更新时间:2023-12-05 09:32:46 26 4
gpt4 key购买 nike

我只是不知道如何让下面的代码工作,假设它会在无限循环中永远运行,事实上,当我从 await Task.Delay方法 Method_FOO,但我需要 Method_FOO 是异步的。

我认为要使此工作正常进行,Thread.Start() 方法需要“可等待”(不仅仅是它运行的代码),但 Thread.Start 是无效的。我注意到,如果我使用 eg.: Console.ReadLine 阻止执行,它将打印 Worked 字符串,但这不是解决方案,而且在现实生活中很糟糕。

这段代码只是一个例子,但是线程需要在无限循环中运行(这不是我可以改变的),我需要异步方法,因为我需要使用一些 websockets,看起来没有同步C# 中的客户端 websocket 类。

但是,仍然必须有一个简单/体面的解决方案来解决这个问题。

public static class Program
{
public static async Task Main(string[] args)
{
var cancellationTokenSource = new CancellationTokenSource();
var thread1 = new Thread(async () => await Run(cancellationTokenSource.Token, "threadName1", Method_FOO));
var thread2 = new Thread(async () => await Run(cancellationTokenSource.Token, "threadName2", Method_FOO));

thread1.Start();
thread2.Start();
}

private static async Task Method_FOO(CancellationToken cancellationToken)
{
Console.WriteLine("It is called...");
await Task.Delay(300, cancellationToken);
//never reach this part
Console.WriteLine("Worked ...");
}

// workd but it is not async
//private static Task Method_FOO(CancellationToken cancellationToken)
//{
// Console.WriteLine("It is called...");
// Console.WriteLine("Worked ...");
// return Task.CompletedTask;
//}


private static async Task Run(CancellationToken cancellationToken, string threadName, Func<CancellationToken, Task> function)
{
try
{
while (true)
{
await function(cancellationToken);
Console.WriteLine($"{threadName} waiting ...");
cancellationToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(1));
}
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
}

最佳答案

在历史的这一点上,new Thread 几乎只对 COM 互操作有用。在所有其他情况下,都有更好的解决方案。在这种情况下,您可以使用 Task.Run 将工作发送到线程池:

public static async Task Main(string[] args)
{
var cancellationTokenSource = new CancellationTokenSource();
var task1 = Task.Run(async () => await Run(cancellationTokenSource.Token, "threadName1", Method_FOO));
var task2 = Task.Run(async () => await Run(cancellationTokenSource.Token, "threadName2", Method_FOO));

await Task.WhenAll(task1, task2);
}

关于C# 如何在命令行应用程序中使用异步方法运行线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67702980/

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