我正在尝试打印"正在加载"代理异步运行时的每秒钟
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