正在取消在其他命名空间中运行的任务

本文关键字:运行 任务 命名空间 取消 其他 | 更新日期: 2023-09-27 18:27:01

我只是想知道什么是最好的方法。目前,我已经在GUI命名空间中声明了CancellationTokenSource,这样我就可以在按下按钮时调用它。

namespace Namespace1
{
    public class Number1
    { 
    CancellationTokenSource cancelToken = new CancellationTokenSource();
    ....

然后我编写了一个构造函数,它接受CancellationTokenSource参数并将其分配给本地声明的字段,然后我在方法中使用该字段。

namespace Namespace2
{
    public class Number2
    {
        CancellationTokenSource cancelToken;
        public testing(CancellationTokenSource cancelToken)
        {
            this.cancelToken = cancelToken;
        }
        ... default constructor and method(s) follow.

我应该用不同的方式写这篇文章吗?还是可以?

正在取消在其他命名空间中运行的任务

命名空间可以帮助您组织代码。

您需要以某种方式公开您的CancellationTokenSource变量。不能只让一个变量在类定义之外浮动。

我建议您使用属性。例如,您可以从类的实例中将CancellationTokenSource公开为公共属性,以便其他类(即使它们在其他命名空间中)也可以访问它。避免使用公共变量。

namespace ConsoleApplication1
{
    namespace SomeOtherSpace
    {
        public class TokenWrapper
        {
            public CancellationToken CancelToken { get; set; }
        }
    }
    namespace YetAnotherSpace
    {
        public class AnotherClass
        {
            private readonly CancellationToken _Token;
            public AnotherClass(CancellationToken token)
            {
                _Token = token;
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            SomeOtherSpace.TokenWrapper wrapper = new SomeOtherSpace.TokenWrapper();
            wrapper.CancelToken = new CancellationToken();
            YetAnotherSpace.AnotherClass anotherClass = new YetAnotherSpace.AnotherClass(wrapper.CancelToken);
        }
    }
}

编辑

作为对您评论的回应,一个更好的想法是让您可以创建一个CancellationTokenSource,然后将CancellationToken传递给需要订阅它的类。它几乎适合我能想到的所有场景。

static void Main(string[] args)
{
    CancellationTokenSource sourceToken = new CancellationTokenSource();
    Task.Factory.StartNew(() => { MyTask(sourceToken.Token); });
}
static void MyTask(CancellationToken token)
{
    //do stuff
}