如何使用任务异步运行委托



我正在尝试打印"正在加载"代理异步运行时的每秒钟

indicator返回true以指示处理已经结束,从而结束while循环

public delegate bool MyDelegate();
public static async Task Loading(MyDelegate indicator)
{
bool AsyncMethodFinished = false;
while (!AsyncMethodFinished)
{
Console.WriteLine("Loading...");
AsyncMethodFinished = await Task.Run(()=>indicator.Invoke());
Thread.Sleep(TimeSpan.FromSeconds(1));
}
}

例如,如果";指示器";需要10秒才能完成,输出应该是10倍";正在加载&";,但我拿不到。

我正在努力学习如何在这些类型的练习中使用Task,但我不明白它是如何工作的,你能帮助我实现它吗
谢谢!

也许这个例子会让你更清楚:

namespace Test
{
class Program
{
static void Main(string[] args)
{
var @do = new Do();
Task.Run(() => @do.DoSomthing());
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Main things in thread=>" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(100);
}
Console.ReadKey();
}
}
public class Do
{
public async Task<bool> DoSomthing()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Doing Something in thread=>" + Thread.CurrentThread.ManagedThreadId);
await IOAsync();
}
return true;
}
protected async Task IOAsync()
{
Console.WriteLine("Work is too much in Thread=> " + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(250);
}
}
}

你的应用程序中有主线程,然后你启动一些任务,在它自己内部进行一些异步操作,每个操作都在一个单独的线程中完成

如果做得正确,这样做将最大限度地提高CPU的利用率,并且长期任务永远不会阻塞主线程。

DoSomething((方法需要2500毫秒才能完成,而主操作只需要1000毫秒,所以你会看到控制台是如何编写的,在DoSometing((中打4或5次勾后,主操作就会完成。

您可以使用等待和延迟数,并进行迭代以更好地了解情况。

如果看到输出,您会注意到主线程id总是相同的,因为它是同步运行的,但作业线程id不能保证相同,这意味着作业由不同的线程完成。

-------------输出---------------

线程中的主要内容=>1

在线程中执行某些操作=>4

线程=>中的工作量太大;4

线程中的主要内容=>1

线程中的主要内容=>1

在线程中执行某些操作=>4

线程=>中的工作量太大;4

线程中的主要内容=>1

线程中的主要内容=>1

在线程中执行某些操作=>4

线程=>中的工作量太大;4

线程中的主要内容=>1

线程中的主要内容=>1

在线程中执行某些操作=>4

线程=>中的工作量太大;4

线程中的主要内容=>1

线程中的主要内容=>1

线程中的主要内容=>1

在线程中执行某些操作=>5

线程=>中的工作量太大;5

在线程中执行某些操作=>5

线程=>中的工作量太大;5

在线程中执行某些操作=>5

线程=>中的工作量太大;5

在线程中执行某些操作=>5

线程=>中的工作量太大;5

在线程中执行某些操作=>5

线程=>中的工作量太大;5

在线程中执行某些操作=>6

线程=>中的工作量太大;6

最新更新