gpt4 book ai didi

C# 命名任务什么是正确的方法?

转载 作者:太空宇宙 更新时间:2023-11-03 10:22:38 25 4
gpt4 key购买 nike

我正在尝试处理串联任务。

我的想法是有类似于下一个代码的东西,但是 VS 将我的代码标记为:

cannot convert from 'System.Threading.Tasks.Task' to 'System.Action' in Argument1

语法的正确方法是什么?

public void startAllTasks()
{
Task task1 = new Task(() => GetLocalDbRecords());
Task task2 = new Task(() => CreatePlainTextFile());
Task task3 = new Task(() => SendToWS());
task1.ContinueWith(task2);
task2.ContinueWith(task3);
task1.Start();
}

我通过使用下一个代码得到了我想要的结果(我知道我必须优化它),但我的想法是通过使用“ContinueWith”和一个 CancellationToken 来改进它,但还没有成功

public void startAllTasks()
{
records = 0;
stopFlag = false;
tasksRunning = new Dictionary<int, bool>();
tasksRunning.Add(1, false);
tasksRunning.Add(2, false);
tasksRunning.Add(3, false);
currentStep = 0;
while (!stopFlag)
{
if (currentStep == 0 && !tasksRunning[1])
{
tasksRunning[1] = true;
Task task1 = new Task(() => this.GetLocalDbRecords());
task1.Start();
}
if (currentStep == 1 && !tasksRunning[2])
{
tasksRunning[2] = true;
Task task2 = new Task(() => this.CreatePlainTextFile());
task2.Start();
}
if (currentStep == 3 && !tasksRunning[3])
{
tasksRunning[3] = true;
Task task3 = new Task(() => this.SendToWS());
task3.Start();
}
Thread.Sleep(100);
}
}

最佳答案

这是正确的语法(下面的解释):

Task task1 = new Task(() => GetLocalDbRecords());
Task task2 = new Task(() => CreatePlainTextFile());
Task task3 = new Task(() => SendToWS());
task1.ContinueWith(x => task2.Start());
task2.ContinueWith(x => task3.Start());
task1.Start();

请注意 ContinueWith方法没有收到 Task它收到 Action<Task> , 这个Action在第一个 Task 之后调用已完成,它将收到第一个 Task作为参数,因此您可以使用它的返回值。

您还可以使用 Task.Factory 的这种流畅语法这也消除了您使用 Task.Start() 的需要:

Task.Factory.StartNew(GetLocalDbRecords)
.ContinueWith(x => CreatePlainTextFile())
.ContinueWith(x => SendToWS())
.Wait();

为了使用CancellationToken你需要使用 CancellationTokenSource它是这样工作的:

来自 MSDN's Page about Task cancellation

1) Create and start a cancelable task.

2) Pass a cancellation token to your user delegate and optionally to the task instance.

3) Notice and respond to the cancellation request in your user delegate.

4) Optionally notice on the calling thread that the task was canceled.

还有一个代码示例:

CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;

Task.Factory.StartNew(GetLocalDbRecords)
.ContinueWith(x => CreatePlainTextFile(), tokenSource.Token)
.ContinueWith(x => SendToWS(), tokenSource.Token);

tokenSource.Cancel();
bool cancelationRequested = token.IsCancellationRequested; //Value will be true.

Task使用 tokenSource.Cancel(); 时 s 不会自动停止因为它们可能在相同的 Thread 上运行调用了它们,它们必须知道 CancellationToken并投票 IsCancellationRequested如果他们希望根据它停止,但是,如果 Task或其连续的TaskCancellationToken 时,我们正试图开始已被要求取消,Task或其连续的Task s 不会首先被调用。

此外,您可以使用 CancellationTokenSource.CancelAfter(TimeSpan)以便在取消前设置超时。

关于C# 命名任务什么是正确的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32850042/

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