小编i3a*_*non的帖子

将Dictionary <DateTime,T>序列化为BSON时的BsonSerializationException

我最近从已弃用的v1.9转移到了新的MongoDB C#驱动程序v2.0.

现在,当我序列化一个有字典的类时,我有时遇到以下情况BsonSerializationException:

MongoDB.Bson.BsonSerializationException:使用DictionaryRepresentation.Document时,键值必须序列化为字符串.

这是一个最小的重现:

class Hamster
{
    public ObjectId Id { get; private set; }
    public Dictionary<DateTime,int> Dictionary { get; private set; }
    public Hamster()
    {
        Id = ObjectId.GenerateNewId();
        Dictionary = new Dictionary<DateTime, int>();
        Dictionary[DateTime.UtcNow] = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

static void Main()
{
    Console.WriteLine(new Hamster().ToJson());
}
Run Code Online (Sandbox Code Playgroud)

.net c# mongodb mongodb-csharp-2.0 mongodb-.net-driver

18
推荐指数
3
解决办法
8239
查看次数

我对async/await的理解,它是如何工作的以及它的好处,对吗?

我曾经多次断言我对async/await的理解,经常就我是否正确进行辩论.如果有人能够证实或否认我的理解,并清除任何误解,以便我不传播错误信息,我真的很感激.

高级别的理解

async/ await是一种在编写异步代码时避免回调地狱的方法.正在执行异步方法的线程在遇到线程池时将返回线程池await,并在等待的操作完成后将执行该操作.

低级别的理解

JIT会将异步方法拆分为await点周围的离散部分,允许在保留方法状态的情况下重新进入方法.在封面下,这涉及某种状态机.

与并发的关系

async/ await并不意味着任何形式的并发.使用async/ 编写的应用程序await可以完全是单线程的,同时仍然可以获得所有好处,就像node.js尽管有回调一样.与node.js不同,.NET是多线程的,因此通过使用async/ await,您可以获得非阻塞IO的好处,而无需使用回调,同时还具有多个执行线程.

好处

async/ await释放线程以在等待IO完成时执行其他操作.它还可以与TPL一起使用,以在多个线程上执行CPU绑定工作,或者在UI线程之外执行CPU绑定工作.

为了从非阻塞IO中受益,需要在API之上构建异步方法,这些API 实际上利用了最终由OS提供的非阻塞IO.

滥用

这是我理解中最大的争论点.很多人认为在a中Task使用阻塞操作并使用async/ await会带来性能提升.通过创建一个额外的线程来处理操作,将原始线程返回到线程池,然后在任务完成后恢复原始方法,所有发生的都是不必要的上下文切换,而不是真正释放线程来完成其他工作.虽然这并不像TPL那样滥用async/ await,但这种心态似乎源于对async/ 的误解await.

.net task-parallel-library async-await

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

表观BufferBlock.Post/Receive/ReceiveAsync种族/错误

交叉发布到http://social.msdn.microsoft.com/Forums/en-US/tpldataflow/thread/89b3f71d-3777-4fad-9c11-50d8dc81a4a9

我知道......我并没有真正使用TplDataflow来发挥它的最大潜力.ATM我只是BufferBlock用作消息传递的安全队列,其中生产者和消费者以不同的速率运行.我看到一些奇怪的行为,让我难以理解如何继续.

private BufferBlock<object> messageQueue = new BufferBlock<object>();

public void Send(object message)
{
    var accepted=messageQueue.Post(message);
    logger.Info("Send message was called qlen = {0} accepted={1}",
    messageQueue.Count,accepted);
}

public async Task<object> GetMessageAsync()
{
    try
    {
        var m = await messageQueue.ReceiveAsync(TimeSpan.FromSeconds(30));
        //despite messageQueue.Count>0 next line 
        //occasionally does not execute
        logger.Info("message received");
        //.......
    }
    catch(TimeoutException)
    {
        //do something
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中(它是2000行分布式解决方案的一部分),Send每100ms左右定期调用一次.这意味着一个项目被Post编到messageQueue在约10次.这已经过验证.但是,偶尔看起来ReceiveAsync在超时内没有完成(即Post没有导致ReceiveAsync完成)并且TimeoutException在30秒后被提升.在这一点上,messageQueue.Count是数百.这是出乎意料的.这个问题已经在较慢的发布率(1个帖子/秒)中观察到,并且通常在1000个项目通过之前发生BufferBlock.

因此,要解决此问题,我使用以下代码,它可以工作,但偶尔会在接收时导致1秒延迟(由于上面发生的错误)

    public async …
Run Code Online (Sandbox Code Playgroud)

c# dataflow task-parallel-library async-await tpl-dataflow

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

IAsyncCursor如何用于使用mongodb c#驱动程序进行迭代?

我正在尝试获取服务器中所有数据库的列表,并最终将它们打印出来(即使用它们的名称作为strings).使用以前版本的c#驱动程序,我可以调用它Server.GetDatabases(),但已被替换为ListDatabasesAsync().

返回值是一个IAsyncCursor<>,我不知道如何处理它.如何用这样的游标遍历数据库列表(或任何东西)?

.net c# mongodb async-await mongodb-.net-driver

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

使用带有ItemRequired = Required.Always的Json.Net进行反序列化时忽略属性

我正在使用Json.Net将类序列化和反序列化为json和back.

我添加了一个标有[JsonObject(ItemRequired = Required.Always)](或Required.Always)新的get-only属性的类.这导致以下结果JsonSerializationException:

Newtonsoft.Json.JsonSerializationException:'<PropertyName>'在JSON中找不到必需属性

我认为标记该属性JsonIgnore可以解决问题,但这不起作用.

我如何告诉Json.Net应该忽略这个属性?

这是一个重现问题的最小例子:

[JsonObject(ItemRequired = Required.Always)]
public class Hamster
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    [JsonIgnore]
    public string FullName { get { return FirstName + LastName; }}
}

private static void Main()
{
    var hamster = new Hamster {FirstName = "Bar", LastName = "Arnon"};
    var serializeObject = JsonConvert.SerializeObject(hamster);
    var deserializeObject = JsonConvert.DeserializeObject<Hamster>(serializeObject);
}
Run Code Online (Sandbox Code Playgroud)

.net c# serialization json json.net

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

MongoDB如何检查是否存在

我想知道如何使用mongoDB和C#检查对象的存在.

我找到了一种方法,但是由于Any()方法,我不得不使用Linq,但是我想知道如果没有Linq可以做到这一点吗?

database.GetCollection<ApplicationViewModel>("Applications").Find(Query.EQ("Name", applicationName)).Any()
Run Code Online (Sandbox Code Playgroud)

多谢你们!

.net c# mongodb mongodb-.net-driver

16
推荐指数
3
解决办法
2万
查看次数

我想等待抛出AggregateException,而不仅仅是第一个Exception

等待故障任务(具有异常集的任务)时,await将重新抛出存储的异常.如果存储的异常是a AggregateException,它将重新抛出第一个并丢弃其余的异常.

我们如何使用await并同时抛出原件AggregateException以便我们不会意外丢失错误信息?

注意,当然可以考虑使用hacky解决方案(例如,试一试await,然后调用Task.Wait).我真的希望找到一个干净的解决方案.这里最好的做法是什么?

我想过使用自定义awaiter,但内置TaskAwaiter包含很多魔法,我不知道如何完全重现.它调用TPL类型的内部API.我也不想重现所有这些.

如果你想玩它,这是一个简短的repro:

static void Main()
{
    Run().Wait();
}

static async Task Run()
{
    Task[] tasks = new[] { CreateTask("ex1"), CreateTask("ex2") };
    await Task.WhenAll(tasks);
}

static Task CreateTask(string message)
{
    return Task.Factory.StartNew(() => { throw new Exception(message); });
}
Run Code Online (Sandbox Code Playgroud)

只抛出两个例外中的一个Run.

请注意,Stack Overflow上的其他问题无法解决此特定问题.建议重复时请小心.

c# task-parallel-library async-await c#-5.0

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

在键盘事件中使用CancellationToken调用Task.Delay时的TaskCanceledException

我试图延迟在WinRT中从键盘事件调用的方法(在示例中为SubmitQuery())的处理,直到一段时间内没有其他事件(在这种情况下为500毫秒).

我只想在我认为用户输入完成后运行SubmitQuery().

使用下面的代码,当Task.Delay(500,cancellationToken.Token)时,我不断收到System.Threading.Tasks.TaskCanceledException; 叫做.我在这做错了什么?

CancellationTokenSource cancellationToken = new CancellationTokenSource();

private async void SearchBox_QueryChanged(SearchBox sender, SearchBoxQueryChangedEventArgs args)
{

        cancellationToken.Cancel();
        cancellationToken = new CancellationTokenSource();

    await Task.Delay(500, cancellationToken.Token);

    if (!cancellationToken.IsCancellationRequested)
    {
        await ViewModel.SubmitQuery();
    }
}
Run Code Online (Sandbox Code Playgroud)

c# asynchronous cancellationtokensource windows-runtime cancellation-token

16
推荐指数
4
解决办法
8084
查看次数

并行读取和处理文件C#

我有非常大的文件,我必须阅读和处理.这可以使用线程并行完成吗?

这是我做过的一些代码.但它似乎没有得到更短的执行时间读取和处理文件一个接一个.

String[] files = openFileDialog1.FileNames;

Parallel.ForEach(files, f =>
{
    readTraceFile(f);
});        

private void readTraceFile(String file)
{
    StreamReader reader = new StreamReader(file);
    String line;

    while ((line = reader.ReadLine()) != null)
    {
        String pattern = "\\s{4,}";

        foreach (String trace in Regex.Split(line, pattern))
        {
            if (trace != String.Empty)
            {
                String[] details = Regex.Split(trace, "\\s+");

                Instruction instruction = new Instruction(details[0],
                    int.Parse(details[1]),
                    int.Parse(details[2]));
                Console.WriteLine("computing...");
                instructions.Add(instruction);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c# multithreading

16
推荐指数
2
解决办法
3万
查看次数

定期以指定的时间间隔运行异步方法

我需要从C#Web应用程序向服务发布一些数据.用户使用应用程序时会收集数据本身(一种使用情况统计信息).我不希望在每个用户的请求期间向服务发送数据,我宁愿在应用程序中收集数据,然后在一个单独的线程中发送单个请求中的所有数据,这不会满足用户的请求(我的意思是用户不必等待服务处理请求).为此,我需要一种JS的setInterval模拟 - 每隔X秒启动一次函数,将所有收集的数据刷新到服务中.

我发现Timer该类提供了一些类似的(Elapsed事件).但是,这允许只运行一次方法,但这不是一个大问题.它的主要困难是需要签名

void MethodName(object e, ElapsedEventArgs args)
Run Code Online (Sandbox Code Playgroud)

虽然我想启动异步方法,它将调用web服务(输入参数并不重要):

async Task MethodName(object e, ElapsedEventArgs args)
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议如何解决所描述的任务?任何提示赞赏.

.net c# asp.net multithreading async-await

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