C# 嗯。如果您想跟踪挂起的执行,您必须自己跟踪这些执行并采取相应的行动。任务框架本身不提供终止任务的方法。您可以找出某个任务正在运行的线程并终止该线程,但这是一个肮脏的解决方案,不建议这样做。我是否应该/可以在这一行之后使用“t.wait(timoutMs)”

C# 嗯。如果您想跟踪挂起的执行,您必须自己跟踪这些执行并采取相应的行动。任务框架本身不提供终止任务的方法。您可以找出某个任务正在运行的线程并终止该线程,但这是一个肮脏的解决方案,不建议这样做。我是否应该/可以在这一行之后使用“t.wait(timoutMs)”,c#,task,libcurl,C#,Task,Libcurl,嗯。如果您想跟踪挂起的执行,您必须自己跟踪这些执行并采取相应的行动。任务框架本身不提供终止任务的方法。您可以找出某个任务正在运行的线程并终止该线程,但这是一个肮脏的解决方案,不建议这样做。我是否应该/可以在这一行之后使用“t.wait(timoutMs)”,而不是麻烦使用令牌和“wait t”?是的,您可以,但这不会结束您的任务。它将继续运行到最后。@JetSetJim如果您这样做,那么代码就不会是异步的。您可以构建一个新任务,该任务将。您可以使用类似这样的方法创建一个任务,该任务将在取消令牌时


嗯。如果您想跟踪挂起的执行,您必须自己跟踪这些执行并采取相应的行动。任务框架本身不提供终止任务的方法。您可以找出某个任务正在运行的线程并终止该线程,但这是一个肮脏的解决方案,不建议这样做。我是否应该/可以在这一行之后使用“t.wait(timoutMs)”,而不是麻烦使用令牌和“wait t”?是的,您可以,但这不会结束您的任务。它将继续运行到最后。@JetSetJim如果您这样做,那么代码就不会是异步的。您可以构建一个新任务,该任务将。您可以使用类似这样的方法创建一个任务,该任务将在取消令牌时完成,但这不会阻止操作继续执行…它想做的任何事情,如果这对您来说足够的话。@Sefe-那么这是否意味着挂起任务中实例化的easy.Perform()将继续存在,直到它完成为止?如果它在后续调用中一直挂起,则可能是一个问题,因为没有任何东西会对其进行整理。如果它引发异常,则会导致任务出错,从而结束任务。如果您想跟踪挂起的执行,您必须自己跟踪这些执行并采取相应的行动。任务框架本身不提供终止任务的方法。您可以找出某个任务正在运行的线程并终止该线程,但这是一个肮脏的解决方案,不推荐这样做。
public void runTest()
{
   if(isRunning)
   {
      return; //Plus some logging that one or more of the tests hasn't completed
   }
   try {
       isRunning = true;
       Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL);
       CancellationTokenSource cts = new CancellationTokenSource(httpTimeoutValueMs * 2);
       foreach (var url in urls)
            taskList.Add(doAsyncCurls(url, cts))
       List<CurlResults> listOfResults = Task.WhenAll(taskList.Select(x => x)).Result.ToList();
       taskList.Clear();
  }
  catch {/*Some exception handling code*/}
  finally { 
    isRunning = false; 
    Curl.GlobalCleanup();
  }
}
private static async Task<CurlResults> doAsyncCurls(string url, CancellationTokenSource cts)
{
    try
    {
      /*Initiate a Curl using libCurl*/
      Easy easy = new Easy();
      easy.SetOpt(CURLoption.CURLOPT_URL, url);
      easy.SetOpt(CURLoption.CURLOPT_DNS_CACHE_TIMEOUT, 0); //Disables DNS cache
      easy.SetOpt(CURLoption.CURLOPT_CONNECTTIMEOUT, httpTimeoutValueMs / 1000); //20sec timeout

      Task t = new Task(() => easy.Perform(), cts.Token);
      t.Start();
      await t;
      return new CurlResults(/*valid results parameters*/);
    } 
    catch (TaskCanceledException)
    { /*Cancellation token invoked*/
        return new CurlResults(/*Invalid results parameters*/);
    }
    catch (Exception e)
    { /*Other exception handling*/ 
        return new CurlResults(/*Invalid results parameters*/);
    }
Task t = new Task(() => easy.Perform(), cts.Token);