Если вы хотите запустить две задачи параллельно, вам нужно использовать новый поток для второй задачи, также вам нужно условно остановить второй поток.
CancellationTokenSource TokenSource = new CancellationTokenSource();
CancellationToken Ct = TokenSource.Token;
Task Demo = Task.Run(() =>
{
do
{
Thread.Sleep(1000);
Trace.Write("loop");
} while (!Ct.IsCancellationRequested);
}, Ct);
bool Flag = true;
if (Flag)
{
TokenSource.Cancel();
}
Вы можете увидеть больше информации об асинхронном программировании здесь Явное создание и запуск задач
и около Отмена задания
Обновление
если вы хотите сделать это в веб-приложении, вам нужно запустить вторую задачу в потоке, который не завершится после завершения запроса.
public class MvcApplication : System.Web.HttpApplication
{
static Task Demo = null;
static CancellationTokenSource TokenSource = null;
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
TokenSource = new CancellationTokenSource();
CancellationToken Ct = TokenSource.Token;
Demo = Task.Run(() =>
{
do
{
Thread.Sleep(1000);
Trace.Write("loop");
} while (!Ct.IsCancellationRequested);
}, Ct);
}
public static void CancelLoop()
{
TokenSource.Cancel();
}
}
и вам нужно отменить второе задание (содержать цикл while) с запросом.
например:
public class HomeController : Controller
{
public JsonResult ButtonPressed()
{
MvcApplication.CancelLoop();
return Json("canceled", JsonRequestBehavior.AllowGet);
}
}