我对异常处理的工作方式从来没有完全满意,有很多异常和try/catch带来的表(堆栈展开等),但它似乎在这个过程中打破了很多OO模型.
无论如何,这是问题所在:
假设您有一些包装或包含网络文件IO操作的类(例如,在某个特定的UNC路径上读取和写入某个文件).由于各种原因,您不希望这些IO操作失败,因此如果您检测到它们失败,则重试它们并继续重试它们,直到它们成功或达到超时.我已经有了一个方便的RetryTimer类,我可以实例化它并用于在重试之间休眠当前线程并确定超时时间已经过去等等.
问题是你在这个类的几个方法中有一堆IO操作,你需要将它们包装在try-catch/retry逻辑中.
这是一个示例代码段:
RetryTimer fileIORetryTimer = new RetryTimer(TimeSpan.FromHours(10));
bool success = false;
while (!success)
{
try
{
// do some file IO which may succeed or fail
success = true;
}
catch (IOException e)
{
if (fileIORetryTimer.HasExceededRetryTimeout)
{
throw e;
}
fileIORetryTimer.SleepUntilNextRetry();
}
}
Run Code Online (Sandbox Code Playgroud)
那么,如何避免在整个班级中为每个文件IO操作复制大部分代码?我的解决方案是在类中使用匿名委托块和单个方法来执行传递给它的委托块.这允许我在其他方法中做这样的事情:
this.RetryFileIO( delegate()
{
// some code block
} );
Run Code Online (Sandbox Code Playgroud)
我有点喜欢这个,但它还有很多不足之处.我想听听其他人如何解决这类问题.
回到Unix的时代,如果不先阅读手册页,你甚至无法关闭软件.然后Mac和Windows具有一致的菜单布局和键盘快捷键,但您仍然看到了收缩包装盒中附带的纸质用户手册,其中描述了应用程序中可能的每一项操作.在Internet之后,帮助文件变成了html文档.
如今,使用Web 2.0应用程序,您几乎看不到帮助.即使它存在,它们只是描述一些特定的任务.换句话说,应用程序更多地依赖于用户群的常识或不让我思考的因素.
几年前,微软提出了一个名为" 归纳用户界面"的概念,它基本上告诉程序员在应用程序本身上发出指令,但我不确定这个想法有多受欢迎.
F1键是否有帮助文件,用户手册和上下文相关的在线帮助?如果用户无法从UI中找到要做的事情,我是否失败了?如果没有,我应该提供多大程度的帮助?(适用于桌面和网络应用)
编辑:文档/帮助文件如何与敏捷开发方法相结合?例如,开发人员应该在UI更改之前三思而后行,这可能会淘汰一堆屏幕截图吗?
为什么Equals方法从泛型方法中返回不同的结果?我认为这里有一些我不明白的自动拳击.
这是一个使用.net 3.5或4.0重现行为的示例:
static void Main(string[] args)
{
TimeZoneInfo tzOne = TimeZoneInfo.Local;
TimeZoneInfo tzTwo = TimeZoneInfo.FindSystemTimeZoneById(tzOne.StandardName);
Console.WriteLine(Compare(tzOne, tzTwo));
Console.WriteLine(tzOne.Equals(tzTwo));
}
private static Boolean Compare<T>(T x, T y)
{
if (x != null)
{
return x.Equals(y);
}
return y == null;
}
Run Code Online (Sandbox Code Playgroud)
输出:
False
True
Run Code Online (Sandbox Code Playgroud)
编辑:此代码按预期工作,没有多少妥协:
private static Boolean Compare<T>(T x, T y)
{
if (x != null)
{
if (x is IEquatable<T>)
{
return (x as IEquatable<T>).Equals(y);
}
return x.Equals(y);
}
return y == null;
}
Run Code Online (Sandbox Code Playgroud)
跟进:我通过MS …
假设我正在尝试在Windows上自动安装某些东西,我想在尝试安装之前尝试测试是否正在进行其他安装.我无法控制安装程序,必须在自动化框架中执行此操作.有没有更好的方法来做这个,一些win32 api?,而不仅仅是测试msiexec是否正在运行?
[更新2]
改进了以前用于直接访问互斥锁的代码,这更加可靠:
using System.Threading;
[...]
/// <summary>
/// Wait (up to a timeout) for the MSI installer service to become free.
/// </summary>
/// <returns>
/// Returns true for a successful wait, when the installer service has become free.
/// Returns false when waiting for the installer service has exceeded the timeout.
/// </returns>
public static bool WaitForInstallerServiceToBeFree(TimeSpan maxWaitTime)
{
// The _MSIExecute mutex is used by the MSI installer service to serialize installations
// and prevent multiple …Run Code Online (Sandbox Code Playgroud) 我在根目录中有以下robots.txt的网站:
User-agent: *
Disabled: /
User-agent: Googlebot
Disabled: /
User-agent: Googlebot-Image
Disallow: /
Run Code Online (Sandbox Code Playgroud)
Googlebots会整天扫描此网站中的网页.我的文件或Google有问题吗?