小编Sna*_*nak的帖子

在Unity中序列化和反序列化Json和Json数组

我有一个从PHP文件发送到Unity的项目列表WWW.

WWW.text样子:

[
    {
        "playerId": "1",
        "playerLoc": "Powai"
    },
    {
        "playerId": "2",
        "playerLoc": "Andheri"
    },
    {
        "playerId": "3",
        "playerLoc": "Churchgate"
    }
]
Run Code Online (Sandbox Code Playgroud)

[]从哪里修剪额外的string.当我尝试使用它解析它时Boomlagoon.JSON,只检索第一个对象.我发现我已经到deserialize()了列表并导入了MiniJSON.

但我很困惑如何deserialize()这个列表.我想遍历每个JSON对象并检索数据.如何使用C#在Unity中执行此操作?

我正在使用的课程是

public class player
{
    public string playerId { get; set; }
    public string playerLoc { get; set; }
    public string playerNick { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

修剪后[]我可以使用MiniJSON解析json.但它只返回第一个KeyValuePair.

IDictionary<string, object> players = Json.Deserialize(serviceData) as IDictionary<string, object>;

foreach (KeyValuePair<string, …
Run Code Online (Sandbox Code Playgroud)

c# json unity-game-engine

81
推荐指数
3
解决办法
11万
查看次数

使用具有导航属性的接口

我正在尝试使用Entity Framework 4,POCO和Code-Only设置项目.

在实体框架中导航属性的类型是否可以作为接口?

我有一个"任务"课程.可以将任务分配给用户或组,每个用户或组由单独的类表示并存储在单独的表中.这些类看起来像这样:

public class User : IAssignable
{
    public string Name { get; set; }
    public int ID { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
}

public class Group : IAssignable
{
    public string Name { get; set; }
    public int ID { get; set; }
    public string Manager { get; set; }
    public string Department { get; set; }
}

public class Task
{
    public …
Run Code Online (Sandbox Code Playgroud)

.net c# entity-framework code-first entity-framework-4

10
推荐指数
1
解决办法
3919
查看次数

SemaphoreSlim的超时是否会失败?

信号量的真正力量是:

限制可以同时访问资源或资源池的线程数

这是明白的.

但是我从来没有机会玩过度Wait接受超时整数的重载,但是 - 这似乎允许多个线程进入临界区,尽管我已经明确设置信号量不允许一次允许多个线程:

private readonly SemaphoreSlim _mutex = new SemaphoreSlim(1);

private void Main()
{
    Task.Run(() => DelayAndIncrementAsync());
    Task.Run(() => DelayAndIncrementAsync());
}

private void DelayAndIncrementAsync()
{
    _mutex.Wait(2000);

    try
    {
        Console.WriteLine(0);
        Thread.Sleep(TimeSpan.FromSeconds(5));
        Console.WriteLine(1);
    }
    finally
    {
        _mutex.Release();
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

第一个线程进入互斥区域,打印"0"等待5秒,同时2秒后另一个线程进入临界区?

它不是在击败信号量的整个目的吗?

我将使用此超时的真实生活场景是什么,特别是当基本规则是 -

" 信号量 =限制可以同时访问资源或资源池的线程数

c# multithreading semaphore

10
推荐指数
2
解决办法
2623
查看次数

我是否违反了DI模式规则

我对DI很新,所以我的知识并不是最好的.我目前正在开发Asp.Net Core MVC应用程序.

假设我有一个返回a的DLL DataSet(我可以完全控制这个DLL并可以根据需要更改它).

所以DLL中的代码如下所示:

public class DataStore : IDataStore
{       
   private readonly IConfiguration _configuration;       

   public DataStore(IConfiguration configuration)
   {
       _configuration = configuration;
   }

   public DataSet GetDataBySP(string spName, SqlParameter[] parameters = null)
   {
      DataSet ds = new DataSet();
      using(var con = new SqlConnection(_configuration.GetConnectionString("conStr")))
      {
         using(var cmd = new SqlCommand(spName, con))
         {
              cmd.CommandType = CommandType.StoredProcedure;

              if (parameters?.Length > 0)
                 cmd.Parameters.AddRange(parameters);

              con.Open();

              using (var da = new SqlDataAdapter(cmd))
              {
                 da.Fill(ds);
              }
         }
      }
      return ds;
   }
}
Run Code Online (Sandbox Code Playgroud)

现在假设我有一个名为class的类Foo,它只包含两个属性,如下所示:

public …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection asp.net-core-mvc .net-core

7
推荐指数
1
解决办法
383
查看次数

Process.StartInfo.Username为空

我开始一个过程

Process app = new Process();
app.StartInfo.UseShellExecute = false;
app.StartInfo.FileName = path;
app.StartInfo.Domain = "Domain";
app.StartInfo.UserName = "userName";

string password = "Password";
System.Security.SecureString ssPwd = new System.Security.SecureString();

for (int x = 0; x < password.Length; x++)
{
    ssPwd.AppendChar(password[x]);
}

password = "";

app.StartInfo.Password = ssPwd;
app.Start();
Run Code Online (Sandbox Code Playgroud)

然后我确认它正在运行:

private bool IsRunning(string name)
{
    Process[] processlist = Process.GetProcesses();

    if (Process.GetProcessesByName(name).Length > 0)
    {
        string user = Process.GetProcessesByName(name)[0].StartInfo.UserName; 
        log.Debug("Process " + name + " is running by : " + user);

        return true; …
Run Code Online (Sandbox Code Playgroud)

c# asp.net process

6
推荐指数
1
解决办法
430
查看次数

Interlocked.Increment on dictionary value

我正在尝试使用Dictionary来记录Web服务上每个API路径的当前请求数,并增加和减少当前计数我认为一个好方法将使用,Interlocked.Increment()因为它增加了计数并在同一时间读取计数时间.

但是下面的代码给出了一个错误,说ref参数不被归类为变量,我猜是因为dict[key]它不是变量?

var dict = new Dictionary<string, int>();
dict.Add("a", 1);
int i = Interlocked.Increment(ref dict["a"]);
Run Code Online (Sandbox Code Playgroud)

我知道Interlocked.Increment()不能应用于属性,但不会想到通过密钥访问字典会有同样的问题.

最好的方法是什么?

编辑:这里有一些关于此的更多细节.

我正在尝试编写一些代码来限制Web服务的每个API路径上的API调用的数量,因此我有两个字典,策略字典指定每个API路径上允许的并发调用方数和第二个计数字典记录每个API路径上当前有多少呼叫者处于活动状态.

在Web服务执行任何传入请求之前,它将检查上述两个字典,以确定请求是否应该继续,或者只是立即返回HTTP 429(Too Many Requests)响应.

以下是代码的摘录,它首先检查是否存在匹配的策略,然后如果是,则检查是否违反了最大允许请求.

public override async Task Invoke(IOwinContext context)
{
    var url = context.Request.Path.ToString();
    var policy = _policies.FirstOrDefault(x => x.EndpointPath == url);

    if (policy != null)
    {
        try
        {
            if (Interlocked.Increment(ref _currentRequests[policy]) > policy.MaxConcurrentConnection)
            {
                context.Response.StatusCode = 429;
                var message = string.Format(
                    "Max API concurrent calls quota exceeded, please try again …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading web-services

5
推荐指数
3
解决办法
2515
查看次数

如何通过.NET代码杀死Excel.exe?

实际上我正在编写一个小应用程序(WinForms + C#),我正在阅读Excel文件.退出应用程序并转到任务管理器后,我发现Excel.exe仍在运行.当我多次运行我的应用程序时,我发现在任务管理器中运行了多个Excel.exe实例.

那么有人可以告诉我每次退出应用程序时需要做什么来杀死"Excel.exe"...

代码有点像这样:

ApplicationClass appClass = new ApplicationClass();
Workbook workBook = appClass.Workbooks.Open(path, 0, true, 5, "", "", true, XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
Worksheet workSheet = (Worksheet) workBook.ActiveSheet;
Run Code Online (Sandbox Code Playgroud)

全部在此命名空间下:Microsoft.Office.Interop.Excel; 这是COM

c# excel

4
推荐指数
2
解决办法
7085
查看次数

C# - 传递自身对象的继承方法

真正的问题是反射和装配修补/挂钩.我将举一个简单的例子来展示我的问题,而不是太难理解主要问题.

所以让我们想象一下我有这些基本类:

public class Vehicle
{
    public string Name;
    public string Price;

    public void DoSomething()
    {
        Main.Test(this);
    }
}

public class Car : Vehicle
{
    public int Wheels;
    public int Doors;
}
Run Code Online (Sandbox Code Playgroud)

在主要代码上我运行它:

public class Main
{
    public void Start()
    {
        Car testCar = new Car()
        {
            Name = "Test Car",
            Price = "4000",
            Wheels = 4,
            Doors = 4
        };

        testCar.DoSomething();
    }

    public static void Test(Vehicle test)
    {
        // Is this allowed ?
        Car helloWorld = (Car) test;
    } …
Run Code Online (Sandbox Code Playgroud)

c#

3
推荐指数
1
解决办法
180
查看次数

统计某个主题的所有订阅数

我有一个主题,我在其中订阅在游戏中发生确定事件时应该调用的方法。

public Subject<SomeEvent> TestSubject = new Subject<SomeEvent>();
Run Code Online (Sandbox Code Playgroud)

某些实例订阅该主题。

TestSubject.Subscribe(MyMethod);
Run Code Online (Sandbox Code Playgroud)

我的目标是计算有多少方法已订阅该主题。我见过一些使用 Count() 扩展的示例,但我需要一个 int 作为返回值,这样我就可以在其他地方使用它,并且 Count() 返回一个 IObservable。

if (subjectCount > 0)
{
    DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以获取某个主题的订阅数量,或者我是否需要手动跟踪它们(有一个 public int subjectSubcriptions 并在每次订阅方法时添加 1)?

c# unity-game-engine reactive-programming system.reactive observer-pattern

3
推荐指数
1
解决办法
740
查看次数

Serilog 记录到控制台但不记录到文件

我有以下记录器配置和相关类如下。预期的日志消息如下:

2019-03-06 19:49:56.417 +05:30 [INFORMATION] [Main] Start
2019-03-06 19:49:56.435 +05:30 [INFORMATION] [Test1] Test1 logg
Run Code Online (Sandbox Code Playgroud)

我在控制台中看到了两个日志消息。但我只看到文件中的第一个日志。

namespace SerilogTest
{
    public static class MyLogger
    {
        public static ILogger getLogger(String className)
        {
            string logTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u}] [{SourceContext}] {Message}{NewLine}{Exception}";

            Log.Logger = new LoggerConfiguration()
                .WriteTo.Console(outputTemplate: logTemplate)
                .WriteTo.File("log.txt", outputTemplate: logTemplate)
                .CreateLogger()
                .ForContext("SourceContext", className);

            return Log.Logger;
        }    
    }

    public class Program
    {
        private static ILogger Log = MyLogger.getLogger("Main");

        private static void Main(String[] args)
        {
            Log.Information("Start");
            Test1 t1 = new Test1();
            Console.ReadKey();
        }
    }

    public …
Run Code Online (Sandbox Code Playgroud)

c# serilog

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