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

不同线程中的异步方法延续 - 意味着对对象变量的协作式双线程访问?

钱稳
2023-03-14

当我写异步方法时:

public class myGameLoop
{
    protected class GameObject
    {
      ....
    }

    protected GameObject [] myGameObjects;

    public async Task myMethod()
    {
        myPrologue(); //runs on caller thread 1
        await SomeLongOperation().ConfigureAwait(false); //runs on thread 2
        myContinuation(); //maybe on thread 2 or another one from pool
    }
}

我的连续 () 有可能不在同一线程中执行,而不是我的序幕 ()。想象一下,调用方线程是游戏的绘制线程。然后,如果我的Prologue()从myGameObjects数组中更改了非原子对象,并且myContinuation()也使用它们,那么我们就可以从2个线程到对象/数组进行非同步访问,这可能会损坏它们。

是真的还是异步/等待在这种情况下有一些同步的东西?或者我应该避免使用ConfigureAwait(false)?(我不确定有多少线程可以具有单游戏绘制线程同步上下文,所以我将ConfigureWait设置为false以防止意外死锁)。

共有1个答案

吕俊美
2023-03-14

(我不确定有多少线程可以有Monogame绘图线程同步上下文,所以我将配置等待设置为false以防止意外死锁)。

我认为这是误解。如果绘制线程有自己的同步上下文,专门针对该线程,那么如果您使用普通的await,它将在该绘制线程上恢复。在我看来,这就是您想要的。

配置等待(false)的原因不是为了“防止意外死锁”。它只是通知等待您不关心您需要恢复的上下文。因此,如果您确实关心恢复的上下文,那么当然不应该使用配置等待(false)

更多信息请查看我的< code>async介绍博客。

 类似资料:
  • 问题内容: 我已经搜索了很多,但找不到特定的解决方案。关于stackoverflow也有一些问题,但我无法找到满意的答案,所以我再次询问。 我在java中有一个如下类。 我知道如何在Java中使用线程。 现在我想同时执行这两个操作。为此,我创建了两个线程类,一个在运行中执行addString()逻辑,另一个在执行deleteString()逻辑中。我在每个线程的构造函数中传递mylist,但是在对

  • 现在我的问题是:关键字对这种情况有用吗?

  • 本文向大家介绍C#中线程同步对象的方法分析,包括了C#中线程同步对象的方法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中线程同步对象的方法。分享给大家供大家参考。具体分析如下: 在编写多线程程序时无可避免会遇到线程的同步问题。什么是线程的同步呢? 举个例子:如果在一个公司里面有一个变量记录某人T的工资count=100,有两个主管A和B(即工作线程)在早一些时候拿了这个变量的值

  • 在参考Flutter教程时,我遇到了一个下划线。 null

  • 问题内容: 假设我有一个与field共享的对象。多个线程将共享对该对象的引用以访问该字段。但是,线程永远不会同时访问对象。我需要声明为volatile吗? 这样的情况如下: 一个类定义一个唯一字段和一个方法。 一个线程使计数器递增,然后生成另一个使计数器递增的线程,依此类推。 鉴于程序的逻辑,因此无法并发访问计数器。但是,计数器是在多个线程之间共享的。计数器必须波动吗? 的情况的另一个变体是当多个

  • 我已经面临这个问题很多天了,请帮我解决。我正在使用线程同步实现生产者-消费者示例。我在这个传统节目中做了一些调整。我没有只使用一个队列对象,而是使用了两个队列对象。但程序不起作用。。(PS-我知道我可以通过只使用队列的一个对象来让这个程序工作,但如果我想使用两个队列对象呢??) 类队列{ } 类生产者实现Runnable{ } 类消费者实现可运行{ } 公共类测试队列{ }