小编ast*_*ker的帖子

使用FileSystemWatcher监视目录

我正在使用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)

c# io filesystemwatcher copy winforms

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

如何组合TaskCompletionSource和CancellationTokenSource?

我有这样的代码(在这里简化)等待完成任务:

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

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

如何从代码应用部分迁移?

假设我总共有 3 个迁移:A、B 和 C。所有迁移都内置于代码中并从代码中执行(我的意思是 C#)。

我想将所有迁移应用到给定级别(例如 B),让我重新控制,这样我就可以在 EF/migrations/etc 范围之外做任何我喜欢的事情。当我完成我自己的东西时,然后执行完全迁移(所以在这种情况下它意味着 C)。

我知道如何从代码执行完全迁移 :-),但是如何告诉 EF 迁移到给定级别?

从代码 (C#) 执行所有内容在这里至关重要——SQL 脚本或运行外部工具对我来说是行不通的。

对于好奇的头脑:用例——我想为中间的最后一次迁移准备测试。

c# entity-framework-core entity-framework-migrations

6
推荐指数
1
解决办法
259
查看次数

如何在TFS中正确调用GetWorkspace?

目前,当我打电话给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)

c# tfs

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

如何获得 Task.WhenAny 对 Task 和 CancellationToken 的影响?

我有交互式任务,在“最坏”场景中根本不执行,因此它由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 的回答。

c# asynchronous task async-await cancellation-token

5
推荐指数
3
解决办法
1342
查看次数

为什么在性能分析器中禁用内存使用部分?

我想运行内存使用会话或对象分配(最好是两者),但我只有可用的 CPU 使用和 GPU 使用类型。当给定部分被禁用时,VS 不显示任何提示。

我尝试了我写的其他几个项目,一个接一个都只有这两个部分。

我运行 64 位 Windows 10。

c# memory profiler visual-studio-2017

4
推荐指数
2
解决办法
2339
查看次数

如何访问类型的"静态"实例成员?

我想访问"静态"(即在编译时)给定类型的实例成员(当然要检索它们的静态属性,而不是实际值或类似的东西).

考虑:

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# compile-time

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