C# 托管代码中的Createhardlink

C# 托管代码中的Createhardlink,c#,parallel-processing,C#,Parallel Processing,我正在开发一个可以创建数十万个硬链接的应用程序(这是该应用程序的核心功能) 我使用Dotnet4.0中现在可用的并行编程功能。这真的很有效。参见下面的示例snippits 要么: Parallel.For(from, until, delegate(int i) { j += 1; fileIndex = Convert.ToInt32(Math.Round(j * 0.001) + 1); //determine the hardlink files; we have

我正在开发一个可以创建数十万个硬链接的应用程序(这是该应用程序的核心功能)

我使用Dotnet4.0中现在可用的并行编程功能。这真的很有效。参见下面的示例snippits

要么:

Parallel.For(from, until, delegate(int i)
{
    j += 1;
    fileIndex = Convert.ToInt32(Math.Round(j * 0.001) + 1);

    //determine the hardlink files; we have to have an unique name for the hardlink for each individual hardlink
    fileName = fiArray[fileIndex].Name; //Path.GetFileNameWithoutExtension(textBoxFile.Text);
    destinationFileName = Path.Combine(textBoxDestination.Text, string.Concat(fileName, "_", i.ToString(), ".txt"));

    fr.CreateHardLink(destinationFileName, fiArray[fileIndex].FullName);
});
或:

//执行实际工作的循环
for(inti=0;i
{
token.ThrowIfCancellationRequested();//uit boek
返回工作(from,until,false);//待办事项:反对moet nog worden meegenomen
},tokenSource.Token);
任务。添加(计算);
var displayResults=compute.ContinueWith(resultTask=>UpdateControl(),
取消令牌。无,
TaskContinuationOptions.OnlyOnRanToCompletion,
用户界面);
CheckedListBoxFiles.Items.Add(DateTime.Now.ToString()+):为“+displayResults+”文件创建硬链接;
Application.DoEvents();
var displayCanceledTasks=compute.ContinueWith(resultTask=>UpdateControl(),
取消令牌。无,
TaskContinuationOptions.OnlyonCancelled,ui);
CheckedListBoxFiles.Items.Add(DateTime.Now.ToString()+”:在“+DisplayCanceledTasks+”文件”处取消任务;
Application.DoEvents();
}
我的问题是:CreateHardlink是Kernel32.dll的一部分,因此在非托管代码中运行。关于并行ctp,我知道并行任务必须在托管代码中运行。
是否有createhardlink的托管替代方案?有人知道如何在托管代码中创建硬链接吗?有人对并行编程和使用非托管代码有什么想法吗

尝试以并行方式创建硬链接没有什么意义。这不是CPU限制的操作,而是I/O限制的操作。与单纯的串行方法相比,我不希望这种方法有任何性能优势


您关于与硬链接创建相关的托管和非托管代码的问题很有趣。您必须记住,托管代码的任何I/O访问都会在某个时候调用非托管代码。操作系统不受管理,创建硬链接的唯一方法是通过操作系统。我认为您需要更准确地了解CTP对托管代码的限制到底意味着什么。

尝试以并行方式创建硬链接没有什么意义。这不是CPU限制的操作,而是I/O限制的操作。与单纯的串行方法相比,我不希望这种方法有任何性能优势


您关于与硬链接创建相关的托管和非托管代码的问题很有趣。您必须记住,托管代码的任何I/O访问都会在某个时候调用非托管代码。操作系统不受管理,创建硬链接的唯一方法是通过操作系统。我认为您需要更准确地了解CTP对托管代码的限制到底意味着什么。

如果您希望能够取消硬链接创建,但不希望使用多线程,我将实现生产者/消费者队列-一个或多个线程将“在此路径创建硬链接”工作项添加到队列中,单个线程从队列中获取工作项并为它们创建硬链接

这为您提供了取消的灵活性-如果您想停止所有硬链接创建,或者如果您只想取消一个项目,您可以在队列中找到它并将其删除,则可以中止工作线程


从您发布的代码中可以看出,调用Application.DoEvents()是纯粹的、绝对邪恶的。每次你叫它,一只小海豹就会把自己打死。一种更好的方法是让UI在线程池上运行,然后使用(假设这是WPF-如果是Winforms,我知道有一个等价的,但我不知道它是什么)异步更新UI。

如果您想取消硬链接创建,但不想使用多线程,我要做的是实现生产者/消费者队列——一个或多个线程将“在该路径上创建硬链接”工作项添加到队列中,一个线程从队列中获取工作项并为它们创建硬链接

这为您提供了取消的灵活性-如果您想停止所有硬链接创建,或者如果您只想取消一个项目,您可以在队列中找到它并将其删除,则可以中止工作线程


从您发布的代码中可以看出,调用Application.DoEvents()是纯粹的、绝对邪恶的。每次你叫它,一只小海豹就会把自己打死。一种更好的方法是让UI在线程池上进行异步更新,然后使用(假设这是WPF——如果是Winforms,我知道有一个等价的,但我不知道它是什么)异步更新UI。

并行使用非托管操作系统调用与从托管代码执行相比,问题不大。就这么简单。:)

托管代码仅仅意味着它在托管上下文中运行(因此CLR可以跟踪事情)。在执行方面,不管它是托管的还是非托管的


如果我没有记错的话,任何kernel32调用都是原子的,这意味着它是线程安全的。

并行使用非托管操作系统调用与从托管代码执行相比都不是问题。就这么简单。:)

托管代码仅仅意味着它在托管上下文中运行(因此CLR可以跟踪事情)。在执行方面,不管它是托管的还是非托管的


如果我没有记错的话,任何kernel32调用都是原子的,这意味着它是线程安全的。

我使用并行编程的原因是,应用程序还需要跟踪一些soap调用,如果它锁定在某个位置,我们希望能够中断硬链接创建
//loop that does the actual work
for (int i = 0; i < nudThreads.Value; i++)
{
    //determine the work package per task
    from = 0 + until + 1;
    until = (i * (Convert.ToInt32(HardLinks / ThreadNo))) + 1;
    var compute = Task.Factory.StartNew(() =>
    {
        token.ThrowIfCancellationRequested(); //uit boek
        return Work(from, until, false);//todo: counter moet nog worden meegenomen
    }, tokenSource.Token);

    tasks.Add(compute);

    var displayResults = compute.ContinueWith(resultTask => UpdateControls(),
                             CancellationToken.None,
                             TaskContinuationOptions.OnlyOnRanToCompletion,
                             ui);
    CheckedListBoxFiles.Items.Add(DateTime.Now.ToString() + " : Created the hardlinks for: " + displayResults + " files.");
    Application.DoEvents();

    var displayCancelledTasks = compute.ContinueWith(resultTask => UpdateControls(),
                                CancellationToken.None,
                                   TaskContinuationOptions.OnlyOnCanceled, ui);
    CheckedListBoxFiles.Items.Add(DateTime.Now.ToString() + " : Cancelled a task at: " + displayCancelledTasks + " files.");
    Application.DoEvents();
}