取消在不同命名空间中运行的任务

时间:2012-03-06 18:53:10

标签: c# c#-4.0

我只是想知道最好的方法是什么。目前我在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.

我应该以不同的方式写这个还是没关系?

1 个答案:

答案 0 :(得分:0)

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

您需要以某种方式公开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
}