我从一个函数开始一个新的任务,但我不希望它在同一个线程上运行.我不关心它运行在哪个线程上,只要它是一个不同的线程(因此这个问题中给出的信息没有帮助).
我保证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) 以下是我们退出应用程序的方式:
Environment.Exit(0)
Application.Exit()
Form.Close()
这三种方法之间的区别是什么?何时使用每种方法?
我有一个conda虚拟环境,其中安装了几个未使用的软件包(使用pip install
或conda install
).
清理它的最简单方法是什么,以便只保留我的代码实际使用的软件包,并卸载其他软件包?
我已经尝试了几个命令(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) 我正在尝试使用PyCharm进行单元测试(使用unittest
),并且能够使其工作:测试运行器很好地显示测试用例列表和嵌套测试函数.
但是,一旦发现测试,我找不到任何方法(重新)运行特定的测试功能:唯一可用的按钮将运行整个测试列表,右键单击一个测试功能不会显示任何有意义的为此目的的行动.
可以想象,当目的是调试单个测试时,可能需要很长时间.
怎么做到这一点?例如,它可以在Visual Studio中使用,并且看起来像是一个基本功能,因此我假设我必须遗漏一些东西.
我刚刚遇到以下行为:
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) 我正在考虑在具有事件驱动逻辑的MMO游戏服务器中使用C#async\await.让我们假设有数千个实体在已知持续时间内完成一些工作.所以我想调用Time.Delay()
我的每个游戏对象.(这是对常见的无限循环的对立方法,Update()
对每个游戏对象都有一些调用.)
有谁知道如何Task.Delay()
实施?它是否使用计时器?系统资源是否很重?
是否可以产生数千个同时Task.Delay()
调用?
我试图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(); …
是否有任何优雅的方法从数组中删除对象是一个数组的一部分?我一直在使用React和Redux一段时间,但是每次我必须删除或插入数据而不改变状态时会卡住几个小时.
reducer是一个数组,包含具有ID的对象和带有对象的另一个数组,如下所示:
[
{ id:123,
items:[
{ id: abc,
name: albert
},
...
]
},
...
]
Run Code Online (Sandbox Code Playgroud)
我收到两个ID,需要删除带有ID的项目abc
.
我有以下设计模式:
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)
我的问题是,如果OnEvent
在WaitOne
超时和执行步骤退出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) c# ×6
.net ×2
asynchronous ×2
python ×2
anaconda ×1
async-await ×1
clear ×1
closures ×1
conda ×1
dispose ×1
ienumerator ×1
immutability ×1
inheritance ×1
interface ×1
javascript ×1
lambda ×1
locking ×1
logging ×1
mutation ×1
mysql ×1
pip ×1
pycharm ×1
redux ×1
task ×1
unit-testing ×1
vb.net ×1
windows ×1
winforms ×1