【发布时间】:2011-06-01 13:14:44
【问题描述】:
我正在尝试提供一种具有两种方法的功能,一种称为 StartTask(action mymethod) 另一个叫 StopTask();
问题是操作必须有权访问 CancellationTokenSource 以检查取消并退出方法(返回),这不是我真正想要的方法可能在另一个组件或层中,我无法推送每个方法来访问到那个取消令牌源,
我无法推送具有检查取消和返回的流程方法的组件的设计者/开发者。
有什么办法可以有这样的东西,我知道这听起来很奇怪而且不适用,只是想问问。
这是我得到的最好的:
CancellationTokenSource cancellationTokenSource;
private void button1_Click(object sender, EventArgs e)
{
cancellationTokenSource = new CancellationTokenSource();
Task t = new Task(() => Dowork(CancellationAction), cancellationTokenSource.Token, TaskCreationOptions.LongRunning);
t.Start();
}
private bool CancellationAction()
{
if (cancellationTokenSource.IsCancellationRequested)
{
label1.Invoke(new MethodInvoker(() =>
{
label1.Text = "Cancellation Requested!";
}));
return true;
}
return false;
}
private void Dowork(Func<bool> Return)
{
int x = 1;
while (true)
{
x++;
label1.Invoke(new MethodInvoker(() =>
{
label1.Text = x.ToString();
}));
Thread.Sleep(1000);
if (Return())
{
return;
}
}
}
问题是 DoWork 现在必须有一个参数 func ,但是如果该方法已经接受了其他参数怎么办?任务的创建将在另一个类中,它可能不知道要在 CancellationAction 旁边传递什么参数
【问题讨论】:
-
正如名称
CancellationTokenSource所暗示的那样,它是CancellationToken的来源,获得了我访问Token属性的权限。通常,该模式是将CancellationToken传递给相关任务。话虽如此,我无法弄清楚您的最终代码示例要实现的目标。
标签: c# multithreading parallel-processing