我正在使用Windows窗体应用程序来监视目录并将其中的文件移动到另一个目录.
目前它会将文件复制到另一个目录,但是当添加另一个文件时,它将以没有错误消息结束.有时它会在结束第三个文件之前复制两个文件.
这是因为我使用的是Windows窗体应用程序而不是控制台应用程序吗?有没有办法可以阻止程序结束并继续观看目录?
private void watch()
{
this.watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.*";
watcher.Changed += OnChanged;
watcher.EnableRaisingEvents = true;
}
private void OnChanged(object source, FileSystemEventArgs e)
{
//Copies file to another directory.
}
public void Dispose()
{
// avoiding resource leak
watcher.Changed -= OnChanged;
this.watcher.Dispose();
}
Run Code Online (Sandbox Code Playgroud) 我有这样的代码(在这里简化)等待完成任务:
var task_completion_source = new TaskCompletionSource<bool>();
observable.Subscribe(b =>
{
if (b)
task_completion_source.SetResult(true);
});
await task_completion_source.Task;
Run Code Online (Sandbox Code Playgroud)
这个想法是订阅并等待true布尔流.这完成了"任务",我可以继续前进await.
但是我想取消 - 但不是订阅,而是等待.我想传递取消令牌(不知何故),task_completion_source所以当我取消令牌源时,await将继续前进.
怎么做?
更新:CancellationTokenSource这个代码是外部的,我这里所有的都是来自它的令牌.
c# asynchronous async-await cancellationtokensource taskcompletionsource
假设我总共有 3 个迁移:A、B 和 C。所有迁移都内置于代码中并从代码中执行(我的意思是 C#)。
我想将所有迁移应用到给定级别(例如 B),让我重新控制,这样我就可以在 EF/migrations/etc 范围之外做任何我喜欢的事情。当我完成我自己的东西时,然后执行完全迁移(所以在这种情况下它意味着 C)。
我知道如何从代码执行完全迁移 :-),但是如何告诉 EF 迁移到给定级别?
从代码 (C#) 执行所有内容在这里至关重要——SQL 脚本或运行外部工具对我来说是行不通的。
对于好奇的头脑:用例——我想为中间的最后一次迁移准备测试。
目前,当我打电话给GetWorkspace我时,会遇到ItemNotMappedException异常,但是当我手动遍历工作区时,我的代码就可以工作了。这太奇怪了,以至于我想知道是否应该在调用之前先进行刷新或其他操作GetWorkspace?
这是我的代码:
Workspace active = null;
using (var tfs = new TfsTeamProjectCollection(uri))
{
tfs.EnsureAuthenticated();
VersionControlServer vcs = tfs.GetService<VersionControlServer>();
// displaying info and manually finding desired workspace
foreach (var ws in vcs.QueryWorkspaces(null, vcs.AuthorizedUser, Environment.MachineName))
{
Console.WriteLine(ws.Name);
foreach (var f in ws.Folders)
{
Console.WriteLine($" {f.LocalItem}");
if (f.LocalItem == map_path)
active = ws;
}
}
// at this point workspace is found and I can work with it
// but this will crash
Workspace workspace = vcs.GetWorkspace(map_path); …Run Code Online (Sandbox Code Playgroud) 我有交互式任务,在“最坏”场景中根本不执行,因此它由TaskCompletionSource.
我想等待此任务完成,或者我收到的令牌被取消——以先发生者为准。这种工作的完美工具将是Task.WhenAny,唯一的问题是它只需要任务,而我有一个Task和一个CancellationToken。
如何等待(异步地,像Task.WhenAny)触发的第一个事件——完成的任务或取消的令牌?
async Task MyCodeAsync(CancellationToken token)
{
var tcs = new TaskCompletionSource<UserData>(); // represents interactive part
await Task.WhenAny(tcs.Task, token); // imaginary call
UserData data = tcs.Task.Result; // user interacted, let's continue
...
}
Run Code Online (Sandbox Code Playgroud)
我不创建/管理令牌,所以我无法更改它。我必须处理它。
更新:对于这种特殊情况,可以使用Register令牌上的方法取消TaskCompletionSource. 有关更通用的方法,请参阅 Matthew Watson 的回答。
我想运行内存使用会话或对象分配(最好是两者),但我只有可用的 CPU 使用和 GPU 使用类型。当给定部分被禁用时,VS 不显示任何提示。
我尝试了我写的其他几个项目,一个接一个都只有这两个部分。
我运行 64 位 Windows 10。
我想访问"静态"(即在编译时)给定类型的实例成员(当然要检索它们的静态属性,而不是实际值或类似的东西).
考虑:
interface IFoo
{
int X { get; }
}
Run Code Online (Sandbox Code Playgroud)
我想X直接访问以检索编译时已知的内容,例如:
Console.WriteLine(typeof(IFoo::X).Name);
Run Code Online (Sandbox Code Playgroud)
反射是运行时,我问的是编译时.
c# ×7
async-await ×2
asynchronous ×2
compile-time ×1
copy ×1
entity-framework-migrations ×1
io ×1
memory ×1
profiler ×1
task ×1
tfs ×1
winforms ×1