c# - 如何从一个对象启动两个并行线程?
问题描述
假设我有一个对象,该对象具有一种不断运行的方法。我已经创建了一个运行此方法的新线程:
new Thread(new ThreadStart(myObject.firstMethod)).Start();
现在,我有一个我想开始的secondMethod
。myObject
请记住,先前启动的线程不会终止,因为firstMethod
它包含一个循环。
如何开始第二种方法?我需要创建第二个线程吗?
解决方案
它有点不清楚你在问什么或者你到底想要实现什么,但是这里是一个使用Task
运行 2 个无限循环的示例(直到调用取消令牌)
public static void Method1(CancellationToken token)
{
Task.Run(
async () =>
{
while (!token.IsCancellationRequested)
{
// do something
await Task.Delay(500, token); // <- await with cancellation
Console.WriteLine("Method1");
}
}, token);
}
public static void Method2(CancellationToken token)
{
Task.Run(
async () =>
{
while (!token.IsCancellationRequested)
{
// do something
await Task.Delay(300, token); // <- await with cancellation
Console.WriteLine("Method2");
}
}, token);
}
private static void Main(string[] args)
{
var source = new CancellationTokenSource();
Method1(source.Token);
Method2(source.Token);
source.CancelAfter(3000);
Console.ReadKey();
}
Thread
是一个较低级别的概念:如果您直接启动一个线程,您知道它将是一个单独的线程,而不是在线程池等上执行。
Task
不仅仅是“在哪里运行一些代码”的抽象——它实际上只是“对未来结果的承诺”。所以作为一些不同的例子:
Task.Delay
不需要任何实际的 CPU 时间;这就像设置一个计时器在未来关闭- 返回的任务
WebClient.DownloadStringTaskAsync
在本地不会占用太多 CPU 时间;它代表的结果可能大部分时间都花在网络延迟或远程工作(在 Web 服务器上)Task.Run()
真正返回的任务是说“我希望你单独执行这段代码”;该代码执行的确切线程取决于许多因素。请注意,
Task<T>
抽象对于 C# 5 中的异步支持至关重要。一般来说,我建议您尽可能使用更高级别的抽象:在现代 C# 代码中,您应该很少需要显式启动自己的线程。
推荐阅读
- python - Pocketsphinx Python get_raw_data
- java - 使用 string.format 显示二维数组时无法显示输出
- c# - 什么是更快的方法 FindBitmap ot Lockbits c# 找到相同的图像
- ruby - 如何在 Stealth bot 框架中设置 before_action 来路由方法?
- dart - 如何通知父组件更改和刷新视图
- wso2 - 加载注册表资源时 WSO2 EI 6.3.0 日志错误
- r - 无法使用 R 和 gWidgets 管理多个窗口并将数据保存在调查的 GUI 中
- java - 在日志中显示 JAVA_OPTS 环境变量如何配置?
- javascript - react-popper:使用 scheduleUpdate 重新定位
- java - 在 Java 中将 JSON 对象转换为 util.Date