小编Ada*_*dam的帖子

PowerShell使用xcopy,robocopy或copy-item

从批处理文件切换到PowerShell脚本的原因是为了改进进程的错误检查.用于复制的cmdlet在这方面有优势吗?

如果已经存在使用xcopy按文件名单独复制文件的批处理文件,那么将语法转换为copy-item有什么好处?

使用robocopy,xcopy和copy-item有什么好处(相互比较)?例如,当在可靠的网络上处理大量小文件时,robocopy具有优势.如果要在数百台计算机上同时运行此脚本,将数百个文件复制到每个计算机上会影响决策吗?该决定是否应主要关注文件的权限?

powershell xcopy copy-item

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

C#Linq聚合中间值

给定一组正数和负数是否有一个可以获得中间值的Linq表达式?

例如

var heights = new List<int>();    
var numbers = new [] { 5, 15, -5, -15 };    
var curHeight = 0;

foreach (var number in numbers)
{
    curHeight = curHeight + number;
    heights.add(curHeight);
}
Run Code Online (Sandbox Code Playgroud)

此功能将返回 [5, 20, 15, 0]

聚合可以以相同的方式使用,它将通过此​​序列

numbers.aggregate((a, b) => a + b);
0 + 5 = 5, 5 + 15 = 20, 20 - 5 = 15, 15 - 15 = 0
Run Code Online (Sandbox Code Playgroud)

我的问题是,有没有办法使用聚合或其他一些方法来[5, 20, 15, 0]返回中间值?

.net c# linq arrays

12
推荐指数
1
解决办法
1875
查看次数

提高财产的更好方法改变了MVVMLight

使用MVVM Light创建了一个项目.ViewModels通常有很多看起来像这样的属性

class TestModel
{
    public string DisplayValue { get; set; }
}

class TestViewModel : ViewModelBase
{
    public string DisplayValue
    {
         private TestModel model = new TestModel();

         get
         {
              return model.DisplayValue;
         }
         set
         {
              if (model.DisplayValue != value)
              {
                   model.DisplayValue = value;
                   RaisePropertyChanged();
              }
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

有时,该属性不在模型中,而是由本地私有字段支持.这种方法工作正常,但有大量的样板代码.如何减少代码重复?

有没有比我提出的解决方案更好的解决方案,还是我错过了MVVM Light内置的东西?

c# wpf mvvm

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

使用锁不会阻止Collection被修改;枚举操作可能无法执行

这个问题已经问过很多次了,但这是一个特例。

public class JobStatusMonitor
{
    private static List<Job> _runningJobs = new List<Job>();
    private static object myLock = new object();

    public static void AddJob(GPSJob input)
    {
        lock (myLock)
            _runningJobs.Add(input);
    }

    public static void Start(int pollInterval)
    {
        while (true)
        {
            var removeJobs = new List<GPSJob>();
            lock (myLock)
            {
                foreach (var job in _runningJobs)
                {
                    if (job.IsComplete())
                    {
                        removeJobs.Add(job);
                    }
                }
            }

            foreach (var job in removeJobs)
            {
                _runningJobs.Remove(job);
            }

            System.Threading.Thread.Sleep(pollInterval);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

列表_runningJobs是私有的,因此除非使用AddJob方法,否则此类之外的任何内容都无法对其进行修改。AddJob方法使用与foreach循环相同的锁,因此它在迭代时不应修改集合。

我对应该发生的事情的理解是调用了Start(5000),列表中没有任何内容,因此它跳到了Thread.Sleep()。后台进程将作业添加到列表中。while循环返回到foreach循环并应用锁定。在列表上进行迭代时,任何其他尝试添加到集合中的线程将等待迭代完成。一旦迭代完成,这些线程中的每个线程将添加其作业,即使有许多线程尝试添加作业,该锁定也不会导致竞争条件。

实际发生的情况是成功添加了此线程处于休眠状态时添加的任何作业。尽管已锁定,但在迭代此列表时添加的作业不会等待迭代完成。

为什么锁不能阻止此错误?

编辑:复制到锁内的新列表中可以消除错误。

public class JobStatusMonitor
{ …
Run Code Online (Sandbox Code Playgroud)

c# multithreading exception

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

标签 统计

c# ×3

.net ×1

arrays ×1

copy-item ×1

exception ×1

linq ×1

multithreading ×1

mvvm ×1

powershell ×1

wpf ×1

xcopy ×1