小编Vla*_*lad的帖子

使用async/await进行设计 - 一切都应该是异步的吗?

假设我有一个实现的接口方法

public void DoSomething(User user) 
{
    if (user.Gold > 1000) ChatManager.Send(user, "You are rich: " + user.Gold);
}
Run Code Online (Sandbox Code Playgroud)

过了一段时间,我意识到我想改变它:

public async Task DoSomething(User user) 
{
    if (user.Gold > 1000) ChatManager.Send(user, "You are rich: " + user.Gold);
    if (!user.HasReward)
    {
         using(var dbConnection = await DbPool.OpenConnectionAsync())
         {
             await dbConnection.Update(user, u => 
                        {
                            u.HasReward = true;
                            u.Gold += 1000;
                        });
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在更改界面中的方法签名.但调用方法是同步的,我不仅要使它们异步,还要使整个调用树异步.

例:

void A()
{
    _peer.SendResponse("Ping: " + _x.B());
}

double X.B()
{
    return _someCollection.Where(item => y.C(item)).Average();
}


bool Y.C(int …
Run Code Online (Sandbox Code Playgroud)

c# multithreading asynchronous async-await

17
推荐指数
1
解决办法
3258
查看次数

IKVM.Reflection.Emit和Mono.Cecil之间的区别

IKVM.Reflection.Emit具有"读取和发出.NET 1.1,.NET 2.0和.NET 4.0程序集(在运行时,例如,.NET 2.0)"的能力."

Mono.Cecil有相同的吗?这个用例是否可以互换?它们现在都得到支持吗?它们之间的主要区别是什么(发射IL)?

.net reflection ikvm reflection.emit mono.cecil

11
推荐指数
1
解决办法
415
查看次数

在类似Minecraft的游戏中悬崖地形生成

我想生成这样的东西: 悬崖
我使用锐利曲线的Perlin Noise,我的代码产生了那些悬崖: 我的悬崖 .

    for (int x = 0; x < sizeX; x++)
    {
        for (int z = 0; z < sizeZ; z++)
        {
            int floorY = map.GetMaxYNotWater(x, z);
            float n = hillsNoise.Noise(x, z);
            int hillY = (int)(curveHills.Evaluate(n) * 80f);
            if (hillY > floorY + 5)
            {
                for (int y = hillY; y > floorY; y--)
                {
                    map.SetBlock(GetBlock(y), new Vector3i(x, y, z));
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我如何"剪切"它们以制作挂件?

我尝试用额外的曲线这样做:

    for (int x = 0; x < sizeX; x++)
    {
        for (int …
Run Code Online (Sandbox Code Playgroud)

c# procedural-generation perlin-noise

8
推荐指数
1
解决办法
3065
查看次数

如何使 AsyncLocal 流向兄弟姐妹?

这是一个非常简单的示例,我希望可以使用,但是...

    static AsyncLocal<bool> _value = new AsyncLocal<bool>();

    static void Main(string[] args)
    {
        A().Wait();
    }

    static async Task A()
    {
        await B();
        await C();
    }

    static async Task B()
    {
        _value.Value = true;
    }

    static async Task C()
    {
        if (!_value.Value) throw new Exception();
    }
Run Code Online (Sandbox Code Playgroud)

那么是否有可能以某种方式在方法B中存储一些东西,以便值在 中可用C?我只需要通过异步流传递它(不要ThreadStatic)。

c# asynchronous task-parallel-library async-await

8
推荐指数
1
解决办法
2580
查看次数

ORM用于有状态的应用程序.EF适合吗?还是任何?

我需要一个适合有状态应用的ORM.我将在具有持久客户端连接的低延迟实时游戏服务器中的请求之间保留实体.只有一个服务器实例连接到数据库,因此无法从"外部"更改数据,服务器可以依赖其缓存.

当用户远程登录服务器时,其整个配置文件将加载到服务器内存中.还为每个用户创建了几个更高级别的服务,以操作配置文件数据并提供功能.它们还可以具有内部字段(状态)来存储临时数据.当用户想要改变他的签名时,他要求相应的服务这样做.该服务跟踪用户更改其签名的频率,并且每十分钟仅允许一次(例如) - 在db中不跟踪这样的短间隔,这是临时状态.此更改应存储到仅执行1个查询的db : UPDATE users SET signature = ... WHERE user_id = .... 当用户注销时,它会在几分钟/小时不活动后从服务器内存中卸载.这里的Db只是一个存储空间.这就是我称之为有状态的.

  1. 某些实体被视为"静态数据",仅在应用程序启动时加载一次.那些可以从其他"动态"实体引用.加载"动态"实体不应要求重新加载引用的"静态数据"实体.
  2. Update/ Insert/ Delete应该设置/插入/偶与"抽离"实体只删除更改的属性/实体.
  3. 写操作不应每次都从数据库(执行Select)初步加载数据以检测更改.(可以在动态生成的继承器中跟踪状态.)我在本地有一个状态,没有意义加载任何东西.我希望在连接范围之外继续跟踪更改,并在需要时"上传"更改.
  4. 执行操作时,不应更改持久对象的引用.
  5. 每个用户的DBConnection不起作用.预期的在线数千名用户.
  6. 来自"静态数据"的实体可以分配给"动态"enitity属性(表示外键)并且Update应该正确处理它.

现在我正在使用NHibernate,尽管它是为无状态应用程序设计的.它支持重新连接到会话,但看起来非常罕见的使用,要求我使用未记录的行为,并不解决所有问题.

我不确定实体框架 - 我可以这样使用它吗?或者你能建议另一个ORM吗?

如果服务器每次用户按下按钮时都会重新创建(或特别是重新加载)用户对象,那么它将非常快地占用CPU.CPU垂直扩展成本很高但效果很小.相反,如果你没有RAM,你可以去买更多 - 比如水平缩放,但更容易编码.如果你认为应该在这里使用另一种方法,我准备讨论它.

c# nhibernate orm entity-framework stateful

5
推荐指数
1
解决办法
348
查看次数

通过带有范围的多个参数搜索对象的高效设计

我在内存中有一组相同类型的对象,每个对象都有多个不可变int属性(但不仅仅是它们).

我需要在那里(或多个)找到一个对象,其属性在指定值附近的小范围内.例如a == 5+-1 && b == 21+-2 && c == 9 && any d.

存储对象的最佳方法是什么,所以我可以像这样有效地检索它们?

我考虑过制作SortedList每个属性并使用,BinarySearch但我有很多属性,所以我希望有一个更通用的方式,而不是这么多SortedLists.

集合本身不是不可变的很重要:我需要能够添加/删除项目.

是否存在像对象(不仅仅是数据)的内存数据库?

c# algorithm indexing search in-memory-database

5
推荐指数
1
解决办法
227
查看次数

简短说明有更好的表现吗?

我真的需要关心可以发出.s指令的地方吗?或者它只会影响尺寸,但真正的性能会是一样的吗?

生成的dll也将在AOT平台上使用.有.s和没有IL的结果AOT-ed dll是否相同?

我的意思是br.s,ldloca.s等.

c# il opcode aot

5
推荐指数
1
解决办法
185
查看次数

通过在调试中将鼠标悬停在其上来查看变量值

toString()当我将鼠标悬停在Visual Studio上时,是否可以将Idea设置为显示变量值?

intellij-idea

5
推荐指数
1
解决办法
2356
查看次数

在高负载服务器被"连接池已用完,阻止MaxPoolSize或超时"阻止

我将NHibernate与Npgsql 3.1.5.0一起使用,当高负载测试时,有时服务器完全被此异常阻止. 主题

降级到postgresql 9.4.4后,它会在更高的负载下发生,但仍然可以重现.

我还重新检查了所有NHibernate会话和事务是否正确处理,因此我没有打开任何连接.

一段时间后,我打开了0个会话,仍然"连接池已经用尽".奇怪的是,我无法在我的开发机器上重现它(仅限于生产 - Windows Server 2008 R2).

pgAdmin - 服务器状态实际上显示那些无效的140个连接(和20个额外)(query = commit或empty,state = idle).

什么可以导致它?

c# postgresql nhibernate connection-pooling npgsql

5
推荐指数
0
解决办法
1185
查看次数

当重新分配内部有 易失性字段的结构体字段时,假设易失性语义是否安全?

看一下下面的例子:

struct MyStruct
{
     private volatile int _field;
     public void Set(int v) => _field = v;
}

class MyClass
{
    private MyStruct _myStruct;
    // is it same as _myStruct.Set(0)?
    public void SomeMethod() => _myStruct = new MyStruct();
}
Run Code Online (Sandbox Code Playgroud)

基本上,问题是重新分配内部带有易失性字段的整个结构是否使用与直接分配字段相同的易失性语义。

c# multithreading volatile thread-safety memory-barriers

5
推荐指数
1
解决办法
96
查看次数