偶尔我需要在放弃之前多次重试一次手术.我的代码是这样的:
int retries = 3;
while(true) {
try {
DoSomething();
break; // success!
} catch {
if(--retries == 0) throw;
else Thread.Sleep(1000);
}
}
Run Code Online (Sandbox Code Playgroud)
我想在一般的重试函数中重写它,如:
TryThreeTimes(DoSomething);
Run Code Online (Sandbox Code Playgroud)
在C#中有可能吗?该TryThreeTimes()方法的代码是什么?
我想在两条指令之间等待几秒钟,但没有阻止执行.
例如,Thread.Sleep(2000)它不好,因为它会阻止执行.
我的想法是,我调用一个方法,然后等待X秒(例如20)监听一个事件.在20秒结束时,我应该根据20秒内发生的事情进行一些操作.
我为随机时间Random执行Action(void委托)的类创建了一个扩展方法:
public static class RandomExtension
{
private static bool _isAlive;
private static Task _executer;
public static void ExecuteRandomAsync(this Random random, int min, int max, int minDuration, Action action)
{
Task outerTask = Task.Factory.StartNew(() =>
{
_isAlive = true;
_executer = Task.Factory.StartNew(() => { ExecuteRandom(min, max, action); });
Thread.Sleep(minDuration);
StopExecuter();
});
}
private static void StopExecuter()
{
_isAlive = false;
_executer.Wait();
_executer.Dispose();
_executer = null;
}
private static void ExecuteRandom(int min, int max, Action action)
{
Random …Run Code Online (Sandbox Code Playgroud) 我希望每隔10秒从Windows服务(使用C#和.NET完成)调用Business层方法.但是,我不想使用Timer_Elapsed事件,因为如果第一个线程/进程仍在运行,它将启动另一个线程/进程.我只需要一个单线程方法,因为对同一个Business方法的多次调用会产生不必要的复杂性.
所以我在on_start中添加了一个do-while循环.我知道这不是正确的方法,因为它会产生这个过程,如果服务被关闭,它就会成为一个孤儿.
我该如何处理这个问题?
此致,Chak
我在c#中编写一个WPF应用程序,我需要移动一些文件 - 我真的需要知道文件是否成功.为此,我编写了一个检查,确保文件在移动后到达目标目录 - 问题是有时我会在文件完成移动之前进行检查:
System.IO.File.Move(file.FullName, endLocationWithFile);
System.IO.FileInfo[] filesInDirectory = endLocation.GetFiles();
foreach (System.IO.FileInfo temp in filesInDirectory)
{
if (temp.Name == shortFileName)
{
return true;
}
}
// The file we sent over has not gotten to the correct directory....something went wrong!
throw new IOException("File did not reach destination");
}
catch (Exception e)
{
//Something went wrong, return a fail;
logger.writeErrorLog(e);
return false;
}
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我如何确保文件实际到达目的地吗? - 我将要移动的文件可能非常大 - (全高清mp4文件长达2小时)
谢谢!
我不确定采用哪种策略......我专注于我的操作完成,但我也想将性能问题保持在最低限度......有一种名为Execute()的方法必须等待(同步运行)直到操作完成.此操作发生在另一个线程上.有两种方法可以实现同样的事情......
通过使用ManualResetEvent
void Execute()
{
taskHandle = new ManualResetEvent(false);
.
.
//delegate task to another thread
.
.
taskHandle.WaitOne();
}
Run Code Online (Sandbox Code Playgroud)
通过使用简单的while构造
void Execute()
{
.
.
//delegate task to another thread
.
.
while (!JobCompleted)
Thread.Sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)
我应采用两种方法中的哪一种......为什么?
编辑:
Q2.如果我在构造时只是空了怎么办?有什么不同...?
while(!JobCompleted);
Run Code Online (Sandbox Code Playgroud)
编辑:(之前我收集过的东西)
http://www.yoda.arachsys.com/csharp/threads/waithandles.shtml - 这篇文章说手动复制比较慢,因为它们离开了托管代码并重新进入......
我正在开发一个MMORPG游戏服务器,而游戏服务器中80%的功能不需要这种方法,使用它的20%的功能占资源使用的99%.
我正在尝试完成一个限制功能.假设您调用了一个庞大的函数,或者您正在搜索特定条件的海量数据结构.被激活的一个调用可能导致大量CPU使用.
例如,一个庞大的功能,当被调用时,使用稳定的30%的CPU在4秒内完成,比如我们按照标准在拍卖系统中搜索数百万个条目.想象一下,我们有4个人同时这样做.我想制作相同的方法,只占用1%或更少的CPU,可能需要超过15-20秒才能返回相同的结果而不会使硬件匮乏.
截至目前我正在使用这个课程.
public class AsyncLazy<T> : Lazy<Task<T>>
{
public AsyncLazy(Func<T> valueFactory) :
base(() => Task.Factory.StartNew(valueFactory)) { }
public AsyncLazy(Func<Task<T>> taskFactory) :
base(() => Task.Factory.StartNew(() => taskFactory()).Unwrap()) { }
}
Run Code Online (Sandbox Code Playgroud)
这不会阻止值的初始化,并且在使用惰性值时不会阻塞.但是,在大规模操作期间,执行操作会使硬件无法完成任务,从而导致4秒内CPU使用率达到30%.我的目标是在几乎无限的时间内限制呼叫,这样他们就可以在不使硬件匮乏的情况下完成任务.
编辑:感谢Scott Chamberlin用正确的"行话"来纠正我.我不打算懒洋洋地调用一个方法,但我正在寻找"Throttle"特定的方法调用.
我正在用 Java 编写一个游戏,并将 FPS 限制为 60。我想出了两种不同的方法来获得相同的结果,但我想知道其中哪一种是更好/更干净的方法。或者也许你有不同的想法。
while(System.nanoTime() - thisFrame < fps_limit);
Run Code Online (Sandbox Code Playgroud)
或者
Thread.sleep(sleepingTime);
Run Code Online (Sandbox Code Playgroud)
我的想法是while 循环对 CPU 的影响大于Thread.sleep,我是对的吗?
在此先感谢您的帮助!
多姆
c# ×8
.net ×2
sleep ×2
.net-4.0 ×1
.net-4.5 ×1
c#-5.0 ×1
frame-rate ×1
game-engine ×1
java ×1
thread-sleep ×1
timer ×1
timing ×1
wait ×1
wpf ×1