从线程c开始和停止循环#

时间:2017-07-28 10:36:29

标签: c# multithreading

所以这是我需要解决的大问题。我有我的Visual C#应用程序。在此应用程序中,用户输入数据并单击执行。当他们单击执行时,核心方法在新线程中启动,该线程和方法是一个循环。不断使用Method调用器我正在向UserForm发送更新循环实际正在做什么。例如像这样我在每个cicle都更新progressBar。

progressBar1.Invoke((MethodInvoker) delegate { progressBar1.Value += 1; });

我要求在UserForm中添加一个按钮,该按钮会停止该线程中的循环并显示已完成的操作。不退出应用程序而不是停止进程或者我只需要跳转到该线程并停止循环。

我正在考虑使用名为stop_loop.cs的公共方法添加一个公共类。我希望当我启动程序或在新线程中执行核心方法时它将跳转到该类并将cancel设置为= false,如果我单击停止按钮,它也将跳转到该类并将cancel设置为true 。 最后,在该线程中该循环中的每个cicle的开始处,它将检查cancel是否为真。如果是,那么它将停止循环并移动到执行结束。

喜欢这个。不幸的是,我似乎无法从我的核心功能访问这个类。甚至Visual Studio都没有为我提供此选项。我该怎么做 ?

namespace textboxes
{
    public class stop_loop
    {
        public bool is_canceled;

        public void set_canceled(bool state)
        {
            this.is_canceled = state;
        }
        public bool get_canceled()
        {
            return this.is_canceled;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

您应该使用CancellationToken。以下是计算阶乘的示例:

static void Main(string[] args)
{
    CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
    CancellationToken token = cancelTokenSource.Token;

    Task task1 = new Task(async () => await Factorial(5, token));
    task1.Start();

    Console.WriteLine("Type Y to break the loop:");
    string s = Console.ReadLine();
    if (s == "Y")
        cancelTokenSource.Cancel();

    Console.ReadLine();
}

static async Task Factorial(int x, CancellationToken token)
{
    int result = 1;
    for (int i = 1; i <= x; i++)
    {
        if (token.IsCancellationRequested)
        {
            Console.WriteLine("Canceled");
            return;
        }

        result *= i;
        Console.WriteLine("Factorial of {0} equals {1}", i, result);
    }
}