C#启动任务以运行异步方法

C#启动任务以运行异步方法,c#,asynchronous,task,C#,Asynchronous,Task,我正在尝试创建将运行异步方法的任务,问题是我无法等待任务构造函数中的操作参数,或者任务.Factory.StartNew的参数 根据我如何实例化我的任务,我有不同的问题。我提供了七个例子,并对每个例子在下面提出的问题进行了评论 示例代码:(七个任务创建示例) 私有ConcurrentDictionary任务{get;set;} private bool active=true; 专用异步任务StartTasks() { int numTasks=5; 对于(int i=0;iWait DoWor

我正在尝试创建将运行异步方法的任务,问题是我无法
等待任务构造函数中的
操作
参数,或者
任务.Factory.StartNew的参数

根据我如何实例化我的任务,我有不同的问题。我提供了七个例子,并对每个例子在下面提出的问题进行了评论

示例代码:(七个任务创建示例)

私有ConcurrentDictionary任务{get;set;}
private bool active=true;
专用异步任务StartTasks()
{
int numTasks=5;
对于(int i=0;iWait DoWork(状态),“someinfo”,TaskCreationOptions.LongRunning);
task.Start();
//抛出“承诺式任务不能调用Start”。异常
Task Task=新任务(DoWork,“someinfo”,TaskCreationOptions.LongRunning).Unwrap();
task.Start();
//调用Start()后,任务开始执行工作,然后抛出“承诺式任务不能调用Start”。异常
任务=新任务(DoWork,“someinfo”,TaskCreationOptions.LongRunning);
task.Start();
//任务开始工作,但状态为“等待激活”
Task Task=Task.Factory.StartNew(DoWork,“someinfo”,TaskCreationOptions.LongRunning);
//抛出“承诺式任务不能调用Start”。异常
Task Task=Task.Factory.StartNew(DoWork,“someinfo”,TaskCreationOptions.LongRunning).Unwrap();
//用于在工作完成时检查任务
Tasks.TryAdd(task.Id,task);
}
}
专用异步任务工作(对象状态)
{
while(活动)
{
等待MakeHttpRequest();
等待DoSomethingPubound();
//等等
}
//进行任何清理并返回
}
我无法使用
Task.Run()
,因为它不提供
TaskCreationOptions
。这些任务将运行数天

如何启动任务以等待异步操作

如何启动任务以等待异步操作

在TAP中,。因此您实际上只需要调用该方法并保留它返回的任务:

private ConcurrentDictionary<int, Task> Tasks { get; set; }
private async Task StartTasks()
{
  for(int i = 0; i < 5; i++)
  {
    Task task = DoWork(null);
    Tasks.TryAdd(task.Id, task);
  }
}
私有ConcurrentDictionary任务{get;set;}
专用异步任务StartTasks()
{
对于(int i=0;i<5;i++)
{
任务=工作(空);
Tasks.TryAdd(task.Id,task);
}
}
我无法使用Task.Run(),因为它不提供TaskCreationOptions。这些任务将运行数天

您不需要
TaskCreationOptions
。但这并不重要,因为您的工作是异步的,因此不需要首先在线程池上运行

如何启动任务以等待异步操作

在TAP中,。因此您实际上只需要调用该方法并保留它返回的任务:

private ConcurrentDictionary<int, Task> Tasks { get; set; }
private async Task StartTasks()
{
  for(int i = 0; i < 5; i++)
  {
    Task task = DoWork(null);
    Tasks.TryAdd(task.Id, task);
  }
}
私有ConcurrentDictionary任务{get;set;}
专用异步任务StartTasks()
{
对于(int i=0;i<5;i++)
{
任务=工作(空);
Tasks.TryAdd(task.Id,task);
}
}
我无法使用Task.Run(),因为它不提供TaskCreationOptions。这些任务将运行数天


你不需要
TaskCreationOptions
。但这根本不重要,因为你的工作是异步的,所以它不需要在线程池上运行。

这听起来像是一个X-Y问题。你试图解决X,你认为Y是答案,但你不知道怎么做,所以你要问这个问题。这可能是您可以询问X。您应该告诉我们X是什么。作为最后手段,您可以为
Task.Factory.StartNew
创建同步匿名委托,然后通过
.GetAwaiter().GetResult()等待
@Enigmativity我正在使用
HttpClient
从我正在抓取的网站下载页面。由于延迟时间长,我可以并行提取的页面越多越好。这很有效,但我希望能够看到任务状态。当运行此非异步线程时,在等待
HttpClient
时会被阻止。我正在尝试解决这个问题e代表that@DouglasGaskell所以单页下载需要几天时间?@DouglasGaskell-这是一个X-Y问题。这听起来像是微软反应式框架(Rx)的完美工作。你真的应该发布刮片的工作代码并询问我们。这听起来像是一个X-Y问题。你试图解决X,你认为Y是答案,但你不知道如何解决Y,所以你在问这个问题。你最好问X。你应该告诉我们X是什么。作为最后的手段,你可以创建synchro为
Task.Factory.StartNew
创建匿名委托,并通过
.GetAwaiter().GetResult()等待
@Enigmativity我正在使用
HttpClient
从我正在抓取的网站下载页面。由于延迟时间长,我可以并行提取的页面越多越好。这很有效,但我希望能够看到任务状态。当运行此非异步线程时,在等待
HttpClient
时会被阻止。我正在尝试解决这个问题e代表that@DouglasGaskell所以单页下载需要几天时间?@DouglasGaskell-这是一个X-Y问题。对于微软的反应式框架(Rx)来说,这听起来是一个完美的工作。你真的应该发布你的工作代码并询问我们。我是actu