我刚看到这个问题:在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()异步?我错过了一些非常重要的东西?
我们有自定义属性
[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获取默认值的最佳模式是什么?
有没有办法可以找出富文本框中是否发生剪贴板粘贴事件?此事件将用于使用粘贴的文本块执行某些操作.
谢谢
这是我的代码
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代码或类似的东西可以截取.我试过追踪键,鼠标事件并不是很漂亮.
我以为我擅长WinForms的东西,但显然事实并非如此.
此应用程序适用于触摸屏硬件.我只想让其中一个按钮保持按下,所以我把它们做成了带外观的单选按钮Button.它运作良好,但我无法控制它们的大小,如宽度和高度.单选按钮大小由其文本和字体大小控制.如果这是针对常见的Windows应用程序,这不是问题.但这是一个问题,因为我正在为触摸屏开发它.
如何控制单选按钮的大小?
我需要一个类似于.NET的方法来安全地组合路径部分,而不必担心路径分隔符的平台细节.
在QT4中有这样的类和方法吗?
就像是:
QPath::Combine
Run Code Online (Sandbox Code Playgroud) 从"实践中的Java并发"一书第26页:
仅当满足以下所有条件时,才能使用volatile变量:
对变量的写入不依赖于其当前值,或者您可以确保只有一个线程更新该值;
变量不参与其他状态变量的不变量; 和
如何理解" 变量在使用volatile关键字时不参与与其他状态变量的不变量 "?
我有一个类列表的记录,因此用户可以选择按属性名称动态分组行.例如MenuText,RoleName或ActionName.然后我必须执行分组,所以我需要一个通用方法来通过传递列名来处理分组.
示例:
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) 写另一个问题的答案出现了一些有趣的事情,现在我无法理解Interlocked.Increment(ref long value)32位系统是如何工作的.让我解释.
InterlockedIncrement64在编译32位环境时,Native 现在不可用了,好吧,这是有道理的,因为在.NET中你不能根据需要对齐内存,可以从托管调用然后删除它.
在.NET我们可以调用Interlocked.Increment()与对64位的变量的引用,我们仍然没有关于其对齐的任何约束(例如,在一个结构中,也在这里我们可以使用FieldOffset和StructLayout),但文献中没有提到任何限制(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) 假设我有一个简单的PowerShell脚本:
1..3 | Write-Host
Run Code Online (Sandbox Code Playgroud)
ShowWindow(g_hWnd, 1);
UpdateWindow(g_hWnd);
Run Code Online (Sandbox Code Playgroud)
我想知道为什么我们需要打电话UpdateWindow跟随ShowWindow?
.net ×7
c# ×7
winforms ×2
c++ ×1
cil ×1
concurrency ×1
debugging ×1
group-by ×1
inheritance ×1
io ×1
java ×1
linq ×1
path ×1
powershell ×1
qt ×1
qt4 ×1
radio-button ×1
richtextbox ×1
volatile ×1
winapi ×1
windows ×1