相关疑难解决方法(0)

如何从其他线程更新GUI?

Label从另一个线程更新a的最简单方法是什么?

我有一Formthread1,并从我开始另一个线程(thread2).虽然thread2在处理一些文件,我想更新LabelForm用的当前状态thread2的工作.

我怎样才能做到这一点?

.net c# user-interface multithreading winforms

1331
推荐指数
41
解决办法
63万
查看次数

使用Application.DoEvents()

可以Application.DoEvents()在C#中使用吗?

这个函数是否能够让GUI跟上应用程序的其余部分,就像VB6 DoEvents一样?

c# doevents winforms

263
推荐指数
6
解决办法
17万
查看次数

为什么C#中的堆栈大小正好是1 MB?

今天的PC有大量的物理RAM,但是C#的堆栈大小对于32位进程只有1 MB而对于64位进程只有4 MB(C#中的堆栈容量).

为什么CLR中的堆栈大小仍然如此有限?

为什么它恰好是1 MB(4 MB)(而不是2 MB或512 KB)?为什么决定使用这些金额?

对该决定背后的考虑因素和原因感兴趣.

c# clr stack stack-size

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

Thread.Sleep vs Task.Delay?

我知道Thread.Sleep阻止线程.

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

(这个问题不包括差异)

c# multithreading .net-4.0 .net-4.5

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

是否使用async/await创建一个新线程?

我是TPL的新手,我想知道:C#5.0中新增的异步编程支持(通过new asyncawait关键字)如何与线程的创建有关?

具体来说,async/await每次使用它们时是否使用创建新线程?如果有许多嵌套方法使用async/await,是否为每个方法创建了一个新线程?

c# multithreading task-parallel-library async-await c#-5.0

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

使用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
查看次数

使用Thread.Sleep进行等待的替代方法

首先,我不是要问与C#相同的问题- Thread.Sleep的替代方案?,或替代在C#中的Thread.Sleep?.我不认为我使用它不正确,需要一个真正的替代特定情况.

在代码分析运行期间,我看到了一个令人惊讶的违规行为:

Thread.Sleep()的使用是有缺陷设计的标志.

这种违规导致了彼得里奇关于为什么这构成糟糕设计的文章.

我们都知道线程创建很昂贵,线程中的阻塞意味着池上的争用.我们也知道每个线程将分配一个兆内存,因此它应该有一个短的寿命,在UI上阻塞是邪恶的,使用睡眠时间是不可靠的等等.这导致我的观点,如果你真的需要执行睡觉,如果不是Thread.Sleep你应该使用什么?

Peter继续提到零睡眠是Thread.Sleep唯一正确使用放弃线程的时间片并允许其他线程处理的唯一正确用法.然后更可怕的是,这仅仅是因为非托管线程的限制,如果在CLR中重新实现将产生在应用程序中使用Thread.Sleep的副作用.事实上,常见的不良用法的所有要点都是不良用法的好例子.

我在生产代码中有以下情况,使用Thread.Sleep非常成功:

  • 等待文件锁被操作系统放弃(捕获文件锁定问题,等待一秒钟,再试一次,一段时间后放弃).
  • 杀死一个进程并等待它不显示在进程列表中(杀死它,检查它没有运行,等待一秒,检查它是否仍在运行,强行关闭它).
  • 等待复制缓冲区刷新(检查文件大小,尝试访问它,等待,检查大小是否已更改).

在这种情况下不使用Thread.Sleep,我还有其他选择吗?紧密的循环往往会让事情变得更糟,我不相信这会使它的使用变成"设计缺陷",尤其是因为UI上没有任何东西,只有后台线程.在多线程环境中等待其他事物以及影响代码的外部因素,这只是软件的本质,有时您需要等待......

c# multithreading wait thread-sleep

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

Thread.Sleep(2500)vs. Task.Delay(2500).Wait()

我想要清楚一点.我知道Task.Delay内部会使用一个Timer,它显然是基于任务的(等待),但Thread.Sleep会导致线程被阻塞.但是,在任务上调用.Wait会导致线程被阻塞吗?

如果没有,人们会认为这Task.Delay(2500).Wait()比好Thread.Sleep(2500).这跟我所说的SO问题/答案略有不同.Wait().

c# multithreading task task-parallel-library async-await

7
推荐指数
2
解决办法
5616
查看次数

Task.Delay 与 Thread.Sleep 的区别

private static async Task MainFunc()
{
    var watch = System.Diagnostics.Stopwatch.StartNew();

    List<Task<int>> list = new List<Task<int>>();

    for (int i = 1; i <= 3; i++)
    {
        list.Add(TaskFunc(i));
    }

    var taskResult = await Task.WhenAll(list);

    foreach (var item in taskResult)
    {
        Console.Write($"i= {item}.{ Environment.NewLine }");
    }

    list.Clear();

    watch.Stop();
    var elapsedMs1 = watch.ElapsedMilliseconds;

    Console.WriteLine($"Total execution time: { elapsedMs1 }");
    Console.WriteLine();


    watch.Restart();


    for (int i = 1; i <= 3; i++)
    {
        list.Add(Task.Run(() => ThreadFunc(i)));
    }

    var threadResult = await Task.WhenAll(list);

    foreach (var item in …
Run Code Online (Sandbox Code Playgroud)

c# multithreading task async-await

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

我应该总是使用Task.Delay而不是Thread.Sleep吗?

我最近看到了几条建议,说Thread.Sleep永远不应该在生产代码中使用(最近在这个SO问题中).其中许多人主张使用Task.Delay.我发现的大多数解释都使用UI应用程序作为示例,因为Task.Delay显而易见的优点(不阻止UI).

在我的情况下,我Thread.Sleep在一个等待循环内部使用轮询WCF服务的特定条件,如下所示:

DateTime end = DateTime.UtcNow + TimeSpan.FromMinutes(2);
while (DateTime.UtcNow < end)
{
    if (ExternalServiceIsReady() == true)
    {
        return true;
    }
    Thread.Sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,以下潜在优势Task.Delay似乎不适用:

  • 睡眠时间相对于大约15毫秒的典型定时器分辨率相当大,因此准确度的提高Task.Delay似乎微不足道.
  • 该进程是单线程(非UI),必须阻塞直到条件为真,因此使用await在这里没有任何优势.
  • 不需要取消延迟的能力.

这是适合使用的情况Thread.Sleep吗?用替换我的睡眠线有Task.Delay(1000).Wait()什么好处(如果有的话)?

.net c# task-parallel-library async-await thread-sleep

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