【问题标题】:How to tell if a task was started by another task如何判断一个任务是否由另一个任务启动
【发布时间】:2018-12-11 15:11:56
【问题描述】:

我需要查找一个线程是否是另一个线程的子线程。

下面是我正在尝试做的一个过于简单的示例,但基本上我需要判断一个任务是否是另一个任务的子任务。

如果我有一个启动几个任务的函数...

_task1 = FuncA();
_task2 = FuncA();

在那个函数中,它开始另一个任务

public async Task FuncA()
{
  // do something
  await Task.Delay(500, CancellationToken.None).ConfigureAwait(false);

  // then call the other function
  await FuncB().ConfigureAwait(false);
}

public async Task FuncB()
{
  // now check for the 'parent'
  if( IsChildTask(_task1) ) // <--- something similar 
  {
    // child of first task
  }
}

我知道当前的thread id 会改变,(因为 async/await) 是否可以判断当前任务/上下文/线程是否是另一个线程的子线程?。

【问题讨论】:

  • Task FuncB(bool isChild=false) 似乎是最简单的解决方案
  • 也就是说这很像XY Problem
  • 不,因为(在我的简化示例中)FuncA() 的创建方式完全相同。他们都以FuncB()开头,但我怎么知道它是从_task1还是_task2“创建”的?
  • 你想对父任务做某事还是只知道哪个任务是父任务?
  • 无法“识别”Tasks 的父级,任务不保存此信息。另请记住,Task 可能会在任何时候切换Thread(有点),因此您也不能依赖 Thread id。您需要记住,Task 是概念上的,而不是物理上的,与 Thread 不同。您可能会编写某种包含 id (Tasks do have ids) 的包装器,但是您需要自己管理所有这些。我仍然认为这是一个 XY 问题。

标签: c# multithreading asynchronous


【解决方案1】:

最简单的解决方案,告诉谁是调用者

private string task1Name = "task1";
private string task2Name = "task2";

_task1 = FuncA(task1Name );
_task2 = FuncA(task2Name );

public async Task FuncA(sting taskName)
{
  // do something
  await Task.Delay(500, CancellationToken.None).ConfigureAwait(false);

  // then call the other function
  await FuncB(taskName).ConfigureAwait(false);
}

public async Task FuncB(string parentName)
{
  // now check for the 'parent'
  if( parentName == task1Name ) // <--- something similar 
  {
    // child of first task
  }
}

【讨论】:

  • 谢谢,但我希望有一些更通用的东西。我过度简化的示例只有一项任务,但我的实际代码可能有多个子任务的子任务...
猜你喜欢
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多