相关疑难解决方法(0)

编写重试逻辑最干净的方法?

偶尔我需要在放弃之前多次重试一次手术.我的代码是这样的:

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()方法的代码是什么?

.net c#

434
推荐指数
13
解决办法
20万
查看次数

Thread.Sleep vs Task.Delay?

我知道Thread.Sleep阻止线程.

Task.Delay也阻止?或者它就像是Timer使用一个线程进行所有回调(当不重叠时)?

(这个问题不包括差异)

c# multithreading .net-4.0 .net-4.5

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

等待几秒钟而不阻止UI执行

我想在两条指令之间等待几秒钟,但没有阻止执行.

例如,Thread.Sleep(2000)它不好,因为它会阻止执行.

我的想法是,我调用一个方法,然后等待X秒(例如20)监听一个事件.在20秒结束时,我应该根据20秒内发生的事情进行一些操作.

c# timer wait

53
推荐指数
4
解决办法
9万
查看次数

使用Thread.Sleep()总是坏的吗?

我为随机时间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)

c# multithreading sleep

35
推荐指数
3
解决办法
4864
查看次数

如何在不使用Timer的情况下在Windows服务中进行循环

我希望每隔10秒从Windows服务(使用C#和.NET完成)调用Business层方法.但是,我不想使用Timer_Elapsed事件,因为如果第一个线程/进程仍在运行,它将启动另一个线程/进程.我只需要一个单线程方法,因为对同一个Business方法的多次调用会产生不必要的复杂性.

所以我在on_start中添加了一个do-while循环.我知道这不是正确的方法,因为它会产生这个过程,如果服务被关闭,它就会成为一个孤儿.

我该如何处理这个问题?

此致,Chak

c# windows-services

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

线程量子?

什么是线程量,我如何在我的系统上识别它?

language-agnostic multithreading

16
推荐指数
1
解决办法
9272
查看次数

System.IO.File.Move - 如何等待移动完成?

我在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小时)

谢谢!

c# wpf

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

在ManualResetEvent或Thread.Sleep()之间做出选择

我不确定采用哪种策略......我专注于我的操作完成,但我也想将性能问题保持在最低限度......有一种名为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 - 这篇文章说手动复制比较慢,因为它们离开了托管代码并重新进入......

c# multithreading sleep manualresetevent

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

"节流"功能

我正在开发一个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"特定的方法调用.

.net c# c#-5.0

7
推荐指数
1
解决办法
749
查看次数

while循环还是Thread.sleep()?

我正在用 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,我是对的吗?

在此先感谢您的帮助!

多姆

java frame-rate timing game-engine thread-sleep

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