我该如何强制等待在同一线程上继续? - c#

await不保证对衍生任务继续执行同一任务:

private void TestButton_Click(object sender, RoutedEventArgs e)
{
    Task.Run(async () =>
    {
        Debug.WriteLine("running on task " + Task.CurrentId);
        await Task.Delay(TimeSpan.FromMilliseconds(100));
        Debug.WriteLine("running on task " + Task.CurrentId);
    });
}

输出为:

running on task 1
running on task

因此,我们不仅可以看到执行已移至另一个任务,还移至了UI线程。如何创建专用任务并强制等待以始终继续执行此任务?长时间运行的任务也不会这样做。

我已经看到了几个SynchronizationContext implementations,但是到目前为止,它们都不起作用,因为在这种情况下,因为它使用线程并且System.Threading.Thread对于uwp不可用。

参考方案

因此,我们不仅可以看到执行已移至另一个任务,还移至了UI线程。

不,它不在UI线程上。从技术上讲,这也不是一项任务。我在Task.CurrentId in async methods上的博客文章中解释了为什么会发生这种情况。

如何创建专用任务并强制等待以始终继续执行此任务?长时间运行的任务也不会这样做。

您处在正确的轨道上:您需要自定义SynchronizationContext(或自定义TaskScheduler)。

我已经看到了几个SynchronizationContext实现,但是到目前为止,它们都没有起作用,因为在这种情况下,因为它使用线程,所以System.Threading.Thread无法用于uwp。

试用mine。它应适用于UWP 10.0。

从具有返回类型Task的方法返回值 - c#

我可能在这里错过了一些东西。语法不正确。static Task<int> MathOperation(int number) { //return new Task(new Func(TestMethod(number))); } static int LongRunningMethod(int number) { // some long ru…

任务工厂的每个循环等待 - c#

我是新手,对用法有疑问。 Task.Factory是否会在foreach循环中或在“等待”时阻塞所有项目,从而基本上使程序成为单线程?如果我正确地考虑了这个问题,则foreach循环将启动所有任务,然后执行.GetAwaiter()。GetResult();。正在阻塞主线程,直到最后一个任务完成。另外,我只是想要一些匿名任务来加载数据。这是正确的实施方式吗?…

任务并行库-如何立即返回但有并行步骤 - c#

我具有以下需要以非阻塞并行处理方式进行的工作流程。我希望方法DoStuff()立即返回,所以我正在使用任务并行库DoStuff(): Do some setup Parse an Excel file then for each row Fill Template with parsed values Convert filled template to P…

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制

LeetCode题解统计城市的所有灯泡

这个是我刚毕业的时候,一个真实的面试题,这是一个开放题。题目描述:想办法,将一个城市的所有灯泡数量统计出来。题解:费米估算法1、如果某个城市常驻人口有1000万2、假设每5人居住在一套房里,每套房有灯泡5只,那么住宅灯泡共有1000万只3、假设公众场所每10人共享一只灯泡,那么共有100万只4、主要的这两者相加就得出了1100万只当然实际上这是估算的,具体应…