C# 如何访问任务参数?

C# 如何访问任务参数?,c#,multithreading,task,C#,Multithreading,Task,假设我有一个列表: 因此Foo类包含doworksync方法,其设计类似于: public async Task HeavyAsync() { while (true) { string newData = DateTime.Now.ToLongTimeString(); Console.WriteLine(newData); await Task.Delay(200); } } 实际上,我可以使用\u tasks[0]启

假设我有一个
列表

因此
Foo
类包含
doworksync
方法,其设计类似于:

public async Task HeavyAsync()
{
    while (true)
    {
        string newData = DateTime.Now.ToLongTimeString();
        Console.WriteLine(newData);
        await Task.Delay(200);
    }
}
实际上,我可以使用
\u tasks[0]启动
任务

这是可行的,但主要问题是我想要访问
Foo
类的公共属性,但我不能,因为当我键入此命令时:
\u tasks[0]。

我将获得以下方法:

我还尝试使用
GetAwaiter()
await

var foo = await _tasks[0];
但我将得到以下错误:

无法将void赋值给隐式类型的局部变量


如何访问
Foo
属性?

您必须更改方法的接口。任务只是一个“函数指针”,它被执行并完成。如果需要包含已执行函数的对象,则必须将其保存或返回到某个位置

我将执行以下操作:更改async方法以返回如下对象:

public async Task<Foo> HeavyAsync()
{
  while (true)
  {
    string newData = DateTime.Now.ToLongTimeString();
    Console.WriteLine(newData);
    await Task.Delay(200);
  }
  return this;
}
应该使用foo为您提供对foo对象的引用

更新:

或者为类Foo提供以下属性和方法:

class Foo
{
    private Task runningTask {get;set;}

    public void StartTask()
    {
       runningTask = Task.Start( () => ....);
    }

    public async Task WaitTask()
    {
       await runningTask;
    }

    public bool IsRunning => runningTask != null && runningTask.Status......

您可以保存Foo实例列表,而不是在调用方法中保存任务列表。

但是如果我在类
Foo
中有一个名为
IsRunning
的属性,并且我需要使用
Task
访问该属性,该怎么办?啊,我明白了。然后,您需要将任务另存为Foo类中的属性,而不是在调用方法中拥有任务列表,然后您必须拥有Foo列表。我会更新answer@gofal3谢谢,我喜欢你的更新。我有一个问题:如果我创建一个
列表
,并且
doworksync
方法是一个
任务
,那么
Foo
的每个实例将执行一个不同的
任务
?是。创建一个列表,对于每个调用StartTask的实例,每个实例都会在内部调用Task.Start,因此每个Foo实例都有一个单独的任务。
public async Task<Foo> HeavyAsync()
{
  while (true)
  {
    string newData = DateTime.Now.ToLongTimeString();
    Console.WriteLine(newData);
    await Task.Delay(200);
  }
  return this;
}
var foo = await _tasks[0];
class Foo
{
    private Task runningTask {get;set;}

    public void StartTask()
    {
       runningTask = Task.Start( () => ....);
    }

    public async Task WaitTask()
    {
       await runningTask;
    }

    public bool IsRunning => runningTask != null && runningTask.Status......