小编Erw*_*yer的帖子

Task.Factory.StartNew()是否保证使用另一个线程而不是调用线程?

我从一个函数开始一个新的任务,但我不希望它在同一个线程上运行.我不关心它运行在哪个线程上,只要它是一个不同的线程(因此这个问题中给出的信息没有帮助).

我保证TestLock在允许Task t再次输入之前,以下代码将始终退出吗?如果没有,建议的设计模式是什么来防止再次出现?

object TestLock = new object();

public void Test(bool stop = false) {
    Task t;
    lock (this.TestLock) {
        if (stop) return;
        t = Task.Factory.StartNew(() => { this.Test(stop: true); });
    }
    t.Wait();
}
Run Code Online (Sandbox Code Playgroud)

编辑:基于Jon Skeet和Stephen Toub的以下答案,确定性地防止重入的一种简单方法是传递CancellationToken,如此扩展方法所示:

public static Task StartNewOnDifferentThread(this TaskFactory taskFactory, Action action) 
 {
    return taskFactory.StartNew(action: action, cancellationToken: new CancellationToken());
}
Run Code Online (Sandbox Code Playgroud)

c# multithreading locking task task-parallel-library

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

Winforms:Application.Exit vs Enviroment.Exit vs Form.Close

以下是我们退出应用程序的方式:

  1. Environment.Exit(0)
  2. Application.Exit()
  3. Form.Close()

这三种方法之间的区别是什么?何时使用每种方法?

.net c# vb.net windows winforms

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

如何在conda虚拟环境中卸载所有未使用的软件包?

我有一个conda虚拟环境,其中安装了几个未使用的软件包(使用pip installconda install).

清理它的最简单方法是什么,以便只保留我的代码实际使用的软件包,并卸载其他软件包?

python pip package-managers anaconda conda

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

在MySQL中,如何删除/刷新/清除所有不必要的日志?

我已经尝试了几个命令(FLUSH LOGS,PURGE MASTER),但没有删除日志文件(以前激活时)或日志表(mysql/slow_log.CSV和mysql/general_log.CSV及其.frm和.CSM对应项).

SHOW BINARY LOGS返回"您没有使用二进制日志记录".

编辑:我找到了这个简单的解决方案来清除表日志(但还没有使用mysql命令的文件日志):

TRUNCATE mysql.general_log;
TRUNCATE mysql.slow_log;
Run Code Online (Sandbox Code Playgroud)

mysql logging clear

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

在PyCharm IDE 5.0.4中运行特定的单元测试功能

我正在尝试使用PyCharm进行单元测试(使用unittest),并且能够使其工作:测试运行器很好地显示测试用例列表和嵌套测试函数.

但是,一旦发现测试,我找不到任何方法(重新)运行特定的测试功能:唯一可用的按钮将运行整个测试列表,右键单击一个测试功能不会显示任何有意义的为此目的的行动.

在此输入图像描述

可以想象,当目的是调试单个测试时,可能需要很长时间.

怎么做到这一点?例如,它可以在Visual Studio中使用,并且看起来像是一个基本功能,因此我假设我必须遗漏一些东西.

python unit-testing pycharm python-unittest

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

如何在lambda表达式中捕获外部变量的值?

我刚刚遇到以下行为:

for (var i = 0; i < 50; ++i) {
    Task.Factory.StartNew(() => {
        Debug.Print("Error: " + i.ToString());
    });
}
Run Code Online (Sandbox Code Playgroud)

将导致一系列"错误:x",其中大多数x等于50.

同理:

var a = "Before";
var task = new Task(() => Debug.Print("Using value: " + a));
a = "After";
task.Start();
Run Code Online (Sandbox Code Playgroud)

将导致"使用价值:之后".

这显然意味着lambda表达式中的串联不会立即发生.在声明表达式时,如何在lambda表达式中使用外部变量的副本?以下内容不会更好(我承认这不一定是不连贯的):

var a = "Before";
var task = new Task(() => {
    var a2 = a;
    Debug.Print("Using value: " + a2);
});
a = "After";
task.Start();
Run Code Online (Sandbox Code Playgroud)

c# lambda closures asynchronous task-parallel-library

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

使用Task.Delay()的成本是多少?

我正在考虑在具有事件驱动逻辑的MMO游戏服务器中使用C#async\await.让我们假设有数千个实体在已知持续时间内完成一些工作.所以我想调用Time.Delay()我的每个游戏对象.(这是对常见的无限循环的对立方法,Update()对每个游戏对象都有一些调用.)

有谁知道如何Task.Delay()实施?它是否使用计时器?系统资源是否很重?

是否可以产生数千个同时Task.Delay()调用?

c# multithreading asynchronous async-await

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

不能在派生类的IEnumerable基类上使用LINQ方法

我试图IEnumerable<Turtle>在一个派生自已实现的基类的类中实现IEnumerable<Animal>.

为什么base.Cast<Turtle>()在类的任何方法中调用(或基本元素上的任何LINQ方法)都Turtle无法编译?

不可能替换base,this因为它显然导致a StackOverflowException.

以下是复制问题的最小代码示例:

public interface IAnimal {}

public class Animal : IAnimal {}

public class Turtle : Animal {}

public class AnimalEnumerable : IEnumerable<Animal> {
    List<Animal> Animals = new List<Animal>();
    IEnumerator<Animal> IEnumerable<Animal>.GetEnumerator() {
        return Animals.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator() {
        return Animals.GetEnumerator();
    }
}

public class TurtleEnumerable : AnimalEnumerable, IEnumerable<Turtle> {
    IEnumerator<Turtle> IEnumerable<Turtle>.GetEnumerator() {
        return base.Cast<Turtle>().GetEnumerator(); //FAILS WITH "CANNOT RESOLVE SYMBOL Cast"
    }
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,更换base.Cast<Turtle>().GetEnumerator(); …

c# ienumerator inheritance interface

15
推荐指数
2
解决办法
1942
查看次数

从嵌套对象中删除数据而不发生变异

是否有任何优雅的方法从数组中删除对象是一个数组的一部分?我一直在使用React和Redux一段时间,但是每次我必须删除或插入数据而不改变状态时会卡住几个小时.

reducer是一个数组,包含具有ID的对象和带有对象的另一个数组,如下所示:

[
 { id:123,
   items:[
           { id: abc,
             name: albert
           }, 
           ... 
         ]
 }, 
 ... 
]
Run Code Online (Sandbox Code Playgroud)

我收到两个ID,需要删除带有ID的项目abc.

javascript immutability mutation redux

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

如何在EventHandler中尝试Set()时检查是否已经处理了ManualResetEvent?

我有以下设计模式:

    var myObjectWithEvents = new ObjectWithEvents();
    using (var mre = new ManualResetEvent(false)) {
        var onEvent = new EventHandler<EventArgs>((sender, e) => { mre.Set(); });   
        try {
            myObjectWithEvents.OnEvent += onEvent;
            var task = Task.Factory.StartNew(() => {
                myObjectWithEvents.DoSomethingThatShouldRaiseAnEvent();
            });
            var timedOut = !mre.WaitOne(10000);
        }
        finally {
            myObjectWithEvents.OnEvent -= onEvent;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果OnEventWaitOne超时和执行步骤退出using块之后引发,onEvent则仍将调用本地事件处理程序并尝试设置ManualResetEvent mre已经处理掉的那个,即使onEvent应该已经取消注册OnEvent.

一个简单的解决方法是检查是否mre已经处理过,但不幸的是没有这样的字段,并且我认为mre.Set()在try catch块中包装以忽略异常并不干净,因为异常可能经常发生.

你会建议什么是实现上述代码模式目的的最佳和最简单的方法(即等待事件被提出)而不会遇到这种问题?

编辑:感谢您的回答,我创建了以下扩展名并替换mre.Set()mre.TrySet():

    public static void TrySet(this ManualResetEvent …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading dispose design-patterns

12
推荐指数
2
解决办法
2491
查看次数