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);