最初にタスクを開始したメソッドから抜けたら、現在実行中のタスクをIDでフェッチする方法はありますか?私は何とか現在のタスクを取得したいので、プログラムの流れを中断することなく途中実行を中止することができます。例えばC#非同期タスクをフェッチする
:
class Test
{
List<Task> listOfTasks = new List<Task>();
void taskCaller()
{
try
{
var myTask = Task.Factory.StartNew(()=> testMethod());
listOfTasks.Add(myTask);
}
catch (System.Exception)
{
//...
throw;
}
}
void taskGetter()
{
foreach (var item in listOfTasks)
{
if(item == something)
{
item.KillExecution();
}
}
}
private void testMethod()
{
// doing something
throw new NotImplementedException();
}
}
EDIT
私は可能であれば私はそれがしたいと、それは私のために動作しませんように私は、タイマーフェッチを実行していますので、それがキャンセルトークンなしで行わたい私はすぐにtoken.Cancel()
とタスクを殺す場合にのみ、私はtoken.CancelAfter()
を試してみると、DBからのDLLとキャンセルトークンが動作します。
EDIT2:
コードのトンをコピーするのではなく、ここでは全体の流れの擬似です:plast1kの提案を続けて
new timer(repeat method every xx time units)
open DB
do some work
save DB
は...
私がチェックした場合このシナリオでキャンセルが要求された場合は、true
と表示されますが、実行中のタスクには何もしません。
private void getActiveTasks()
{
if (!ListOfTasks.Any())
return;
Console.WriteLine("Currently running:");
foreach (var task in ListOfTasks)
{
Console.WriteLine("\t" + task.Key);
Console.WriteLine("\t" + task.Value.MyTask.Id);
task.Value.Token.Cancel();
Console.WriteLine("\t" + task.Value.Token.IsCancellationRequested);
ListOfTasks.Remove(task.Key);
return;
}
}
ような何かを行うことができますあなたは何か間違ったことをしています。なぜ彼らは働かないのか説明できますか? [XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)を参照してください。 – Equalsk
ここでは、私はそれを更新しました – Norgul
キャンセルトークンを間違って実装しているように聞こえます。これは協調的な取り組みであり、DBからフェッチするメソッドは、渡されたトークンが取り消されたかどうか、そしてメソッドが正常に終了するかどうか定期的にチェックする必要があります。 CancelAfterをCancelよりも前に使用する理由がわかりません。特に、できるだけ早く取り消したい場合はどうすればよいでしょうか? – Equalsk