小编i3a*_*non的帖子

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

取消不接受CancellationToken的异步操作的正确方法是什么?

取消以下内容的正确方法是什么?

var tcpListener = new TcpListener(connection);
tcpListener.Start();
var client = await tcpListener.AcceptTcpClientAsync();
Run Code Online (Sandbox Code Playgroud)

简单地调用tcpListener.Stop()似乎导致a ObjectDisposedException并且该AcceptTcpClientAsync方法不接受CancellationToken结构.

我完全错过了一些明显的东西吗

.net c# asynchronous task-parallel-library async-await

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

获取任务取消语句

我可以在执行任务操作期间获取CancellationToken传递给Task构造函数的内容.大多数样本看起来像这样:

CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

Task myTask = Task.Factory.StartNew(() =>
{
    for (...)
    {
        token.ThrowIfCancellationRequested();

        // Body of for loop.
    }
}, token);
Run Code Online (Sandbox Code Playgroud)

但是如果我的行为不是lambda而是放在其他类中的方法并且我没有直接访问权限token呢?唯一的方法是通过token国家?

.net c# multithreading cancellation-token

22
推荐指数
4
解决办法
9929
查看次数

使用nameof运算符而不是CallerMemberNameAttribute来通知.NET 4.5.3中的属性更改有什么好处?

随着.NET 4.5.3的出现,WPF开发人员现在有三种(或更多)方法来通知INotifyPropertyChanged接口属性更改.基本上,我的问题是从.NET 4.5开始引入的两种方法中哪一种是更有效的方式来通知属性更改以及在WPF中使用时这两种方式是否有任何好处?

背景

对于那些不太熟悉这个主题的人,这里有三个主要方法.第一个是简单传递字符串的原始的,更容易出错的方法:

public string TestValue
{
    get { return testValue; }
    set { testValue = value; NotifyPropertyChanged("TestValue"); }
}

protected virtual void NotifyPropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
Run Code Online (Sandbox Code Playgroud)

第二种方法是在.NET 4.5中引入的; 的CallerMemberNameAttribute:

public string TestValue
{
    get { return testValue; }
    set { testValue = value; NotifyPropertyChanged(); }
}

protected virtual void NotifyPropertyChanged([CallerMemberName]string propertyName = "")
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); …
Run Code Online (Sandbox Code Playgroud)

c# callermembername c#-6.0 .net-4.6 nameof

22
推荐指数
2
解决办法
5148
查看次数

如何在新的mongo C#驱动程序中执行findAll并使其同步

我正在使用官方C#驱动程序来执行FindAll并升级到新的驱动程序2.0.FindAll已过时,将替换为Find.我试图转换一个简单的方法,返回一个列表Class1.无法在文档中找到使用POCO的实际示例

var collection = database.GetCollection<ClassA>(Collection.MsgContentColName); return collection.FindAll().ToList();

有人可以帮我转换2.0驱动程序并返回列表而不是任务吗?

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

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

我们可以为Visual Studio Code编写扩展吗?

我们可以为Visual Studio Code编写扩展吗?

Atom支持自定义包

我们可以建立一个扩展吗?

visual-studio-code

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

将CancellationToken传递给Task Class构造函数有什么用?

下面是一个示例代码,它创建一个模拟长时间运行进程的新任务.任务没有太多关于取消功能.我使用取消令牌来取消任务,代码对我来说很好.

       CancellationTokenSource CTS= new CancellationTokenSource();

       Task<Boolean> PTask = new Task<Boolean>(() => 
       {
           while (true)
           {
               if (!CTS.Token.IsCancellationRequested)
               {
                  Thread.Sleep(5000);
               }
               else{Console.WriteLine("Thread Cancelled");break;}
           }
           return true;

       }, CTS.Token, TaskCreationOptions.None);

       PTask.Start();
       Console.WriteLine("Hit Enter to cancel the Secondary thread you have started");
       Console.ReadLine();
       CTS.Cancel();
       System.Console.WriteLine(PTask.Result);

    }
}
Run Code Online (Sandbox Code Playgroud)

但是我无法理解的是将令牌参数(CTS.Token)传递给任务构造函数.传递参数的实际用途是什么,即使我没有将令牌传递给构造函数也可以实际取消任务.

下面是一个稍微修改过的版本,没有令牌参数.

      CancellationTokenSource CTS= new CancellationTokenSource();
      Task<Boolean> PTask = new Task<Boolean>(() => 
       {
           while (true)
           {
               if (!CTS.Token.IsCancellationRequested)
               {
                   Thread.Sleep(5000);
               }
               else
               {
                   Console.WriteLine("Thread Cancelled");
                   break;
               }
       };
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading cancellation-token

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

TPL Dataflow,如何将项目转发到许多链接目标块中的一个特定目标块?

我正在寻找一个TPL数据流块解决方案,它可以容纳多个项目,可以链接到多个目标块,但是它能够将项目转发到仅通过过滤器/谓词的特定目标块.在任何时候都不应该将项目同时传递到多个目标块,始终只能传递给与过滤器匹配的项目,或者可以丢弃该项目.我不喜欢BroadCastBlock,因为如果我理解正确,它不能保证传送(或者是吗?)并且过滤是在目标块侧完成的,这意味着BroadCastBlock基本上将每个项目的副本发送到所有linkedTo目标块.如果我理解正确,它也不会在任何时候持有多个项目.我不想使用Post/Async但维护LinkTo链.

有没有办法绕过完整的自定义数据流块?或者我误解了BroadCastBlock的工作原理?不幸的是,实际上没有太多文档可以详细介绍并涵盖用例.任何想法都受到高度赞赏.

c# message-passing task-parallel-library actor tpl-dataflow

20
推荐指数
2
解决办法
5403
查看次数

在TryReceiveAll之后使用OutputAvailableAsync的BufferBlock死锁

虽然在工作回答这个问题,我写了这个片断:

var buffer = new BufferBlock<object>();
var producer = Task.Run(async () =>
{
    while (true)
    {
        await Task.Delay(TimeSpan.FromMilliseconds(100));
        buffer.Post(null);
        Console.WriteLine("Post " + buffer.Count);
    }
});
var consumer = Task.Run(async () =>
{
    while (await buffer.OutputAvailableAsync())
    {
        IList<object> items;
        buffer.TryReceiveAll(out items);
        Console.WriteLine("TryReceiveAll " + buffer.Count);
    }
});
await Task.WhenAll(consumer, producer);
Run Code Online (Sandbox Code Playgroud)

生产者应该每隔100毫秒将项目发布到缓冲区,并且消费者应该清除缓冲区中的所有项目并异步地等待更多项目显示.

实际发生的是制作人清除所有项目一次,然后再也不会超越OutputAvailableAsync.如果我切换消费者逐个删除项目,它将作为例外工作:

while (await buffer.OutputAvailableAsync())
{
    object item;
    while (buffer.TryReceive(out item)) ;
}
Run Code Online (Sandbox Code Playgroud)

我误会了什么吗?如果没有,问题是什么?

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

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

我是否需要处理SemaphoreSlim

根据文件:

"a SemaphoreSlim不使用Windows内核信号量".

是否有任何特殊资源SemaphoreSlim使得DisposeSemaphoreSlim不再使用遗嘱时呼叫很重要?

.net c# dispose semaphore idisposable

20
推荐指数
4
解决办法
3812
查看次数