小编Adr*_*tti的帖子

System.IO.File帮助方法的"顺序"文件I/O是否安全?

我刚看到这个问题:在C#中对File类使用静态方法是否安全?.总结一下IOException,在这个ASP.NET代码片段中,OP有一个因为文件正在使用:

var text= File.ReadAllText("path-to-file.txt");
// Do something with text
File.WriteAllText("path-to-file.txt");
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是,由于多个ASP.NET重叠请求,这是一个简单的并发访问问题.我要解决的问题是将I/O集中到同步的线程安全类中(或者删除文件以支持其他内容).我读了两个答案,当我即将向其中一个人投票时,我看到那些用户是谁,我想到了什么,并且停止了.

我会引用它们两者(然后请参阅原始答案以获取更多背景信息).

对于这个OP段:

我猜测文件读取操作有时不会在写操作发生之前关闭文件[...]

答案说:

正确.文件系统不支持原子更新[...]使用FileStream没有帮助[...]文件里面没有魔法.它只是为了您的方便而使用FileStream包装.

但是我没有看到任何期望的原子操作(读取+后续写入)和并行(因为部分重叠的多线程请求)可能导致并发访问.即使是原子 I/O操作(读/写)也会有完全相同的问题.OK FileStream 可以是异步的,但它不是如何File.ReadAllText()File.WriteAllText()使用它.

另一个答案使我更加困惑,它说:

虽然根据文档,该方法保证文件句柄被关闭,但即使引发异常,也不能保证在方法返回之前发生关闭的时间:关闭可以异步完成.

什么?MSDN说方法将打开,读取和关闭文件(如果是异常).这种方法是否有可能异步关闭文件?OS会推迟CloseHandle()吗?在哪些情况下?为什么?

简而言之:它只是一种误解还是CloseHandle()异步?我错过了一些非常重要的东西?

.net c# io

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

在派生类上覆盖customattribute

我们有自定义属性

[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
public class CustomDesignerAttribute: Attribute
Run Code Online (Sandbox Code Playgroud)

然后我们有一个用这个属性装饰的基类

[CustomDesigner(someKey, someValue)]
public class BaseClass
Run Code Online (Sandbox Code Playgroud)

然后我们有一个派生自这个的类,用相同的属性(相同的键,不同的值)装饰

[CustomDesigner(someKey, someOtherValue)]
public class ChildClass : BaseClass
Run Code Online (Sandbox Code Playgroud)

是否有可能ChildClass不创建属性的副本,而是覆盖现有密钥的值(覆盖整个父属性)?如果没有,如果ChildClass没有定义自己的默认值,那么从BaseClass获取默认值的最佳模式是什么?

.net c# inheritance custom-attributes

13
推荐指数
1
解决办法
5804
查看次数

检测富文本框内是否发生粘贴事件

有没有办法可以找出富文本框中是否发生剪贴板粘贴事件?此事件将用于使用粘贴的文本块执行某些操作.

谢谢

这是我的代码

 protected override void WndProc(ref System.Windows.Forms.Message m)
    {
        if (m.Msg == WM_PASTE)
        {
            OnPasteOccurred();
            MessageBox.Show("Pas");
        }
        if (m.Msg == 0x000F)
        {
            if (PaintControl)
            {
                base.WndProc(ref m);
            }
            else
            {
                m.Result = IntPtr.Zero;
            }
        }
        else
        {
            base.WndProc(ref m);
        }
    }
Run Code Online (Sandbox Code Playgroud)

编辑

我希望基于粘贴事件做一些语法突出显示或缩进,这个特定的代码编辑器似乎非常有效.我不知道它是怎么做的.在这个特定方向需要帮助.我很确定必须有一些原生的Win32代码或类似的东西可以截取.我试过追踪键,鼠标事件并不是很漂亮.

.net c# richtextbox winforms

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

如何控制带有外观"按钮"的单选按钮的大小

我以为我擅长WinForms的东西,但显然事实并非如此.

此应用程序适用于触摸屏硬件.我只想让其中一个按钮保持按下,所以我把它们做成了带外观的单选按钮Button.它运作良好,但我无法控制它们的大小,如宽度和高度.单选按钮大小由其文本和字体大小控制.如果这是针对常见的Windows应用程序,这不是问题.但这是一个问题,因为我正在为触摸屏开发它.

如何控制单选按钮的大小?

.net c# radio-button winforms

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

在QT4中有QPath :: Combine吗?

我需要一个类似于.NET的方法来安全地组合路径部分,而不必担心路径分隔符的平台细节.

在QT4中有这样的类和方法吗?

就像是:

QPath::Combine
Run Code Online (Sandbox Code Playgroud)

c++ qt qt4 path path-separator

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

如何理解"变量在使用volatile关键字时不参与与其他状态变量的不变量"?

从"实践中的Java并发"一书第26页:

仅当满足以下所有条件时,才能使用volatile变量:

  • 对变量的写入不依赖于其当前值,或者您可以确保只有一个线程更新该值;

  • 变量不参与其他状态变量的不变量; 和 

  • 在访问变量时,出于任何其他原因,不需要锁定.

如何理解" 变量在使用volatile关键字时不参与与其他状态变量的不变量 "?

java concurrency volatile

11
推荐指数
1
解决办法
886
查看次数

LINQ动态分组

我有一个类列表的记录,因此用户可以选择按属性名称动态分组行.例如MenuText,RoleNameActionName.然后我必须执行分组,所以我需要一个通用方法来通过传递列名来处理分组.

示例:

public class Menu
{
  public string MenuText {get;set;}
  public string RoleName {get;set;}
  public string ActionName {get;set;}
}

public class Menus 
{
 var list = new List<Menu>();
 list.Add( new Menu {MenuText="abc",RoleName ="Admin", ActionName="xyz"};
 list.Add( new Menu {MenuText="abc",RoleName ="Admin", ActionName="xyz"};
 list.Add( new Menu {MenuText="abc1",RoleName ="Admin1", ActionName="xyz1"};
 list.Add( new Menu {MenuText="abc1",RoleName ="Admin1", ActionName="xyz1"};

  /// columnName :- Name of the Menu class ( MenuText  or RoleName  or ActionName)

  public IEnumerable<IGrouping<string,IEnumerable<Menu>>> GroupMenu(string columnName)
  {
          // Here I …
Run Code Online (Sandbox Code Playgroud)

.net c# linq group-by

11
推荐指数
3
解决办法
2万
查看次数

32位环境下64位变量的原子增量

另一个问题的答案出现了一些有趣的事情,现在我无法理解Interlocked.Increment(ref long value)32位系统是如何工作的.让我解释.

InterlockedIncrement64在编译32位环境时,Native 现在不可用了,好吧,这是有道理的,因为在.NET中你不能根据需要对齐内存,可以从托管调用然后删除它.

在.NET我们可以调用Interlocked.Increment()与对64位的变量的引用,我们仍然没有关于其对齐的任何约束(例如,在一个结构中,也在这里我们可以使用FieldOffsetStructLayout),但文献中没有提到任何限制(AFAIK ).这很神奇,它有效!

Hans Passant注意到这Interlocked.Increment()是JIT编译器识别的一种特殊方法,它将发出对 COMInterlocked :: ExchangeAdd64()的调用,然后调用FastInterlockExchangeAddLong,它是InterlockedExchangeAdd64的一个宏,它具有InterlockedIncrement64的相同限制.

现在我很困惑.

忘记一秒钟的托管环境,然后回归原生.为什么InterlockedIncrement64不能工作InterlockedExchangeAdd64呢?InterlockedIncrement64是一个宏,如果内在函数不可用,InterlockedExchangeAdd64那么它可以实现为InterlockedExchangeAdd64... 的调用

让我们回到托管:如何在32位系统上实现原子64位增量?我认为句子"这个函数对于调用其他互锁函数是原子的"很重要,但我仍然没有看到任何代码(感谢Hans指出更深入的实现)来做到这一点.InterlockedExchangedAdd64当内在函数不可用时,让我们从WinBase.h中选择实现:

FORCEINLINE
LONGLONG
InterlockedExchangeAdd64(
    _Inout_ LONGLONG volatile *Addend,
    _In_    LONGLONG Value
    )
{
    LONGLONG Old;

    do {
        Old = *Addend;
    } while (InterlockedCompareExchange64(Addend, …
Run Code Online (Sandbox Code Playgroud)

.net c# interlocked-increment

11
推荐指数
1
解决办法
848
查看次数

PowerShell是否编译脚本?

假设我有一个简单的PowerShell脚本:

1..3 | Write-Host 
Run Code Online (Sandbox Code Playgroud)
  • PowerShell如何处理它?
  • 它是构建内存中的程序集还是一些临时的.dll文件?
  • 我可以使用一些工具(例如ILSpy,VS,WinDbg)检查这个程序集和MSIL吗?
  • PowerShell是否以相同的方式处理文件脚本和REPL命令行输入(即编译/解释)?
  • 我可以将此编译的程序集与C#和其他.Net语言一起使用吗?
  • PS脚本可以编译为本机二进制代码吗?

.net c# debugging powershell cil

10
推荐指数
1
解决办法
3226
查看次数

为什么我们需要在ShowWindow之后调用UpdateWindow?

ShowWindow(g_hWnd, 1);
UpdateWindow(g_hWnd);
Run Code Online (Sandbox Code Playgroud)

我想知道为什么我们需要打电话UpdateWindow跟随ShowWindow

windows winapi

9
推荐指数
3
解决办法
3330
查看次数