当前位置: 首页 > 知识库问答 >
问题:

当整个操作在同一个线程上执行时,为什么域抛出从不正确的线程访问的域

郗缪文
2023-03-14
Task.Factory.StartNew(async () =>
            {
                try
                {
                    ShowCaseInfo existingShowcase = DBService.GetDB().FetchShowcaseInfo();
                    string previousResponse = existingShowcase?.SerializedResponse;
                    Response response = await CloudService.GetCloudService().FetchShowcase();

                    if (response.Status == ResponseStatus.SUCCESS && !string.Equals(previousResponse, response.Data))
                    {
                        ShowCaseInfo showcaseInfo = JsonConvert.DeserializeObject<ShowCaseInfo>(response.Data, _settings);
                        showcaseInfo.SerializedResponse = response.Data;
                        DBService.GetDB().InsertOrUpdateShowcase(showcaseInfo);
                        FetchShowcaseProducts(showcaseInfo.Showcases);
                    }
                    else
                    {
                        List<Showcase> emptyCases = new List<Showcase>();
                            if (existingShowcase != null)
                            {
                                foreach (Showcase showcase in existingShowcase.Showcases)
                                {
                                    if (showcase.Products.Count == 0)
                                    {
                                        emptyCases.Add(showcase);
                                    }
                                }
                            }
                        FetchShowcaseProducts(emptyCases);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            });

foreach(existingShowcase.showcases中的Showcase Showcase)行引发异常。 类似地,在if条件!string.equals(previousResponse,response.data)中,如果我以existingShowCase.SerializedResponse的身份访问previousResponse,则会引发一些异常,而不是局部变量。 根据文档,我们不应该跨线程传递对象,但在本例中,所有操作都在同一个线程中。

共有1个答案

勾通
2023-03-14

在这种情况下,所有操作都在同一个线程中。

不,他们实际上不是。 这是因为等待的工作方式。

Await异步操作时,它捕获其当前上下文--SynchronizationContext.currentTaskScheduler.current。 在这种情况下,上下文是线程池上下文。 因此,当方法在Await之后恢复执行时,它可以在任何线程池线程上恢复执行。

 类似资料:
  • 我如何启动两个线程,其中thread1首先执行,thread2在thread1结束时启动,而主方法线程可以在不锁定其他两个线程的情况下继续工作? 我尝试了join(),但是它需要从线程调用,线程必须等待另一个线程,没有办法执行类似thread2.join(thread1)的操作;因此,如果我在main()中调用join,我将有效地停止主线程的执行,而不仅仅是Thread2的执行。 #编辑:为什么我

  • 问题内容: ConcurrentModificationException:当不允许对对象进行并发修改时,检测到该对象的并发修改的方法可能会抛出此异常。 上面是javadoc中的ConcurrentModificationException定义。 所以我尝试测试以下代码: 代码很简单。10个线程从arraylist对象中删除该元素。确保多个线程访问一个对象。但它运行正常。没有异常被抛出。为什么?

  • 以下是问题陈述: 编写一个java程序,使用线程计算前25个素数,并计算前50个斐波那契数。将计算斐波那契数的线程的优先级设置为8,将另一个设置为5。在计算了30个斐波那契数之后,让这个线程进入睡眠状态,开始计算素数。计算完25个素数后,继续斐波那契数计算。 我的代码: 我本以为当斐波那契线停止时,其余的素数会被打印出来,但那没有发生,这背后的原因可能是什么?

  • 线程可以等待,直到其他线程释放访问同步块的锁。我想知道当其他线程访问同步块时,一个线程可以等待多长时间?什么时候它会知道另一个线程释放了锁?

  • 问题内容: 我们正在做一个MySQL的小型基准测试,我们希望了解它对数据的性能。 该测试的一部分是查看当多个并发线程对服务器执行各种查询时,服务器如何工作。 在MySQL文档(5.0)是不是多线程的客户真的清楚。我应该指出,我确实针对线程安全库()进行了链接 我正在使用准备好的语句,并且同时执行读取(SELECT)和写入(UPDATE,INSERT,DELETE)操作。 我应该为每个线程打开一个连

  • 问题内容: 我知道没有线程可以访问当前视图,除非它是UI线程。我想知道为什么?哪个线程更改视图为什么很重要?是出于安全原因吗?这是我使用的解决方法: 每当我想更改布局时,这样做都是一种痛苦。是否有其他解决方法?我了解异步任务,但从未找到一种使用它的好方法,它比我正在做的更好吗?所有相关的答案都适用! 问题答案: 是的,您的权利:为了安全起见,您不能在另一个线程上修改视图(这就是为什么将其称为UI线

  • 例如: 假设有一个按钮启动异步请求,该请求返回并触发主线程上运行的runnable/callback。会发生什么?runnable被添加到MessageQueue中,并在“时间”到时运行。但是什么时候是“时间”呢?如果在异步请求将runnable发布到MainThread之前,我按下另一个按钮,在MainThread上执行一些半长的阻塞任务呢?它会等到我的阻塞按钮上的逻辑完成吗?会打断它吗?它是否

  • 我在尝试停止运行多个线程的程序时遇到了问题,所有运行的线程都试图找到相同的解决方案,但一旦一个线程找到了解决方案,所有其他线程都将停止。 在main方法中,我创建了一个线程组,使用for循环向其中添加线程并启动它们 在实现Runnable的类中,我很难找出如何使其实现,以便一旦其中一个线程找到解决方案,所有线程都将停止。最终发生的情况是,要么其他线程继续运行,有时这些线程会相互中断并相互覆盖。