我收到了一项可以同时执行多项任务的服务。我被分配添加一个中止选项,该选项应该结束所有当前正在运行的任务。因为系统已经实现,所以将 CancellationTokenSource 传递给每个任务是有问题的,所以我所做的是创建一个所有任务都会侦听取消的单个令牌。当中止接收时,该令牌将发送取消,然后将创建一个新的 CancellationTokenSource 实例。我无法验证所有任务,直到中止之前结束在 启动 CancellationTokenSource 的新实例
几个问题:
起初我以为 TokenSource.Cancel() 只是一个发送的事件,但它似乎被卡在“高位”,所以任何具有相同令牌的新任务也会收到取消,是真的吗?
理想情况下,每个任务都有自己的取消令牌(对吗?),问题是谁需要持有该令牌?谁调用了该任务或任务本身?因为一旦发送取消,我将需要永远保留该令牌,因为我无法判断任务何时到达退出点。
是否有一种已经实现的方法来监视所有当前正在运行的任务,以便在发送取消时我将确保在允许任何新任务之前所有任务都已结束?我使用信号量做到了这一点,但它看起来像是一个糟糕的解决方案。
对于新手问题,我很抱歉,我已经实现了我需要的内容并且它有效,但质量远低于标准,我希望以正确的方式改进它。
我正在尝试动态锁定线程,但无论我尝试什么,总会发生某种竞争条件,这似乎是由多个线程同时启动任务引起的,但我一直无法找到一个好的答案这。
这是一个例子:
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
public static readonly Object padLock = new Object();
public readonly static ConcurrentDictionary<string, object> locks = new
ConcurrentDictionary<string, object>();
public static List<string> processes = new List<string>();
public static void Main()
{
//Add random list of processes (just testing with one for now)
for (var i = 0; i < 1; i++) {
processes.Add("random" + i.ToString());
}
while (true)
{
foreach (var process in processes )
{
var currentProc = …
Run Code Online (Sandbox Code Playgroud) c# parallel-processing multithreading thread-safety threadpool
我是 Python 新手。我正在尝试做某事,但不确定是否可能。我想创建一个运行 1 个函数的线程,并在完成后运行另一个函数。
例如
thread.start_new_thread( func1 )
//Run this thread only after the first one was finished
thread.start_new_thread( func2 )
Run Code Online (Sandbox Code Playgroud)
是否可以用 1 个线程来完成?或者我需要创建 2 个线程?我应该怎么办?
public class Rough {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestThread1 testThread1 = new TestThread1();
TestThread2 testThread2 = new TestThread2();
testThread1.start();
testThread2.start();
// testThread1.stop();
System.out.println(testThread1.getName());
System.out.println(testThread2.getName());
}
}
class TestThread1 extends Thread {
public void run() {
System.out
.println("MyThread1 running :: " + System.currentTimeMillis());
}
}
class TestThread2 extends Thread {
public void run() {
System.out
.println("MyThread2 running :: " + System.currentTimeMillis());
}
}
Run Code Online (Sandbox Code Playgroud)
它每次执行时都会给出随机输出.
Thread-0
Thread-1
MyThread1 running :: …
Run Code Online (Sandbox Code Playgroud) 从理论上讲,似乎单个机器上可以有多个线程池,但.Net框架每台机器只有一个线程池,即使机器有多个处理器也是如此.这个陈述是真的吗?
更新1:
根据Tim的评论,答案是每个进程将有一个.Net线程池.因此,如果在一台计算机上运行多个进程,则该计算机上可以存在多个.Net线程池.
我需要定期调用一个方法而不使用Timer类.该方法将由多线程调用.
我来自Java / Scala,最近开始使用Go。在Java / Scala中,线程池非常普遍,并且至少有四个不同的原因将使用它们。
由于Goroutine是如此轻便,因此不需要1,即使提供一个很好,我们也可以创建某种类型的工作程序池而无需过多地麻烦解决2。
但是,我觉得在Go中我们不能处理3和4。
是因为不需要它还是仅仅是缺少功能?