相关疑难解决方法(0)

Thread.Sleep vs Task.Delay?

我知道Thread.Sleep阻止线程.

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

(这个问题不包括差异)

c# multithreading .net-4.0 .net-4.5

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

正确的方法来延迟任务的开始

我想安排一个任务以x ms开始,并能够在它开始之前取消它(或者只是在任务开始时).

第一次尝试就像是

var _cancelationTokenSource = new CancellationTokenSource();

var token = _cancelationTokenSource.Token;
Task.Factory.StartNew(() =>
    {
        token.ThrowIfCancellationRequested();
        Thread.Sleep(100);
        token.ThrowIfCancellationRequested();
    }).ContinueWith(t =>
    {
        token.ThrowIfCancellationRequested();
        DoWork();
        token.ThrowIfCancellationRequested();
    }, token);
Run Code Online (Sandbox Code Playgroud)

但我觉得应该有一个更好的方法,因为这会在睡眠中耗尽一个线程,在此期间它可以被取消.

我还有什么其他选择?

.net c# task-parallel-library

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

在MVC控制器操作中暂停

我的一位同事写了一些代码,这些代码在进行Web服务调用以检查值的状态之前基本上暂停了1秒.此代码是在MVC 4应用程序的控制器操作中编写的.动作本身不是异步的.

var end = DateTime.Now.AddSeconds(25);
var tLocation = genHelper.GetLocation(tid);

while (!tLocation.IsFinished && DateTime.Compare(end, DateTime.Now) > 0)
{
    var t = DateTime.Now.AddSeconds(1);
    while (DateTime.Compare(t, DateTime.Now) > 0) continue;

    // Make the webservice call so we can update the object which we are checking the status on
    tLocation = genHelper.GetLocation(tid);
}
Run Code Online (Sandbox Code Playgroud)

它似乎有效,但由于某种原因,我对它的实现有一些担忧.是否有更好的方法来延迟?

注意:

  1. 我们不使用.NET 4.5,并且在此解决方案中不会更改为此
  2. 像SignalR这样的Javascript脚本选项目前不是一个选项

我原以为这个问题是一个很好的选择,但是他并没有接受它,并说这不是他所做的工作所必需的.

如何在C#4.0中让任务进入睡眠状态(或延迟)?

c# asp.net-mvc-4

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

监视超时的同步方法

如果同步方法执行时间太长,我正在寻找一种有效的方法来抛出超时异常.我见过一些样品,但没有什么能完全符合我的要求.

我需要做的是

  1. 检查同步方法是否超过其SLA
  2. 如果它确实抛出超时异常

不是要终止同步方法,如果执行时间过长.(多次故障会使断路器跳闸并防止级联故障)

到目前为止我的解决方案如下所示.请注意,我确实将CancellationToken传递给了sync方法,希望它能在超时时遵循取消请求.此外,我的解决方案返回一个任务,然后我可以根据需要等待我的调用代码.

我担心的是,这个代码会为每个监控方法创建两个任务.我认为TPL会很好地管理这个,但我想证实一下.

这有意义吗?有一个更好的方法吗?

private Task TimeoutSyncMethod( Action<CancellationToken> syncAction, TimeSpan timeout )
{
  var cts = new CancellationTokenSource();

  var outer = Task.Run( () =>
  {
     try
     {
        //Start the synchronous method - passing it a cancellation token
        var inner = Task.Run( () => syncAction( cts.Token ), cts.Token );

        if( !inner.Wait( timeout ) )
        {
            //Try give the sync method a chance to abort grecefully
            cts.Cancel();
            //There was a timeout regardless of what the sync …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous

14
推荐指数
1
解决办法
6864
查看次数

如何在一个过程中暂停然后在它之后返回值?

我正在开发一个C#项目,希望在一个程序中做一个小的暂停约2秒.

其实我已经尝试过使用Invoke,但是如你所知,我们不能在类中使用它这种程序.

这是我的代码以获取更多详细信息:

public class GenerateFile
{

    public CSPFEnumration.ProcedureResult GenerateFaxFile(string Daftar_No, string Channelno, string NationalCode)
    {
        string script = string.Format(" DECLARE @RC INT " +
                                        " DECLARE @Daftar_No INT = '{0}' " +
                                        " DECLARE @hokm_type_code INT = 100 " +
                                        " DECLARE @Channelno INT = '{1}' " +
                                        " DECLARE @Id_No BIGINT = '{2}' " +
                                        " EXEC @rc = [dbo].[Hokm_with_type] @Daftar_No, @hokm_type_code, @Channelno, @Id_No ",
                                        Daftar_No,
                                        Channelno,
                                        NationalCode);
        try
        {
            IEnumerable<string> commandStrings = Regex.Split(script, @"^\s*GO\s*$",
                                                    RegexOptions.Multiline | RegexOptions.IgnoreCase); …
Run Code Online (Sandbox Code Playgroud)

c# pause

13
推荐指数
2
解决办法
1106
查看次数

System.Threading.Task不包含定义

我的System.Threading.Task上没有.Delay定义.

 public async Task<string> WaitAsynchronouslyAsync()
 {         
     await Task.Delay(10000);
     return "Finished";
 }
Run Code Online (Sandbox Code Playgroud)

c# multithreading

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

是否有Task.Delay(0)和Task.FromResult(0)的替代方案?

我正在尝试创建一个利用异步/等待功能集的可移植类库(.NET 4.5/Silverlight 5/Win Phone 8/WinRT).我发现我需要包含Microsoft.Bcl.AsyncNuGet包才能使这个功能正常工作,所以我做到了这一点.显然由于我的目标,我无法访问Task.Delay(0)Task.FromResult(0).我想知道下一个最好的选择是什么?

目前,我正在使用:( new Task(() => { })基本上,一个不执行任何操作的任务.)

我不确定这是否与前面提到的模式中的任何一个最佳等效.


更新:显然我是盲目的,并没有TaskEx在我的intellisense菜单中看到.我打开这个问题所以人们知道它就在那里,只是因为我的intellisense自动完成而容易错过TaskExtensions.

.net c# base-class-library async-await portable-class-library

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

从任务调用Thread.Sleep

在任务中使用Thread.Sleep()是否正确.或者只是一个与任务一起使用的计时器(.Net 4.5和后者中的Task.Delay())?或者可能存在另一种方法.

.net delay task-parallel-library c#-4.0 thread-sleep

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

如何更快地取消任务

我有一个Windows服务,它启动时启动任务

这个任务有一个while循环,在执行一次迭代后,它会进入睡眠状态5分钟.

当我停止服务时,首先取消任务,然后执行其他一些操作

如果任务处于睡眠状态,只有在它被唤醒时它才被取消,我希望它被取消,即使它正在睡觉而且不想等待它被唤醒.

以下是代码

Task controllerTask = Task.Factory.StartNew(() =>
{
    var interval = 300;
    while(true)
    {
        if (cancellationToken.IsCancellationRequested) 
            break;
        Thread.Sleep(interval * 1000);
        if (cancellationToken.IsCancellationRequested) 
            break;
        //SOME WORK HERE
    }
}, cancellationToken);
Run Code Online (Sandbox Code Playgroud)

有什么办法吗?

编辑:我无法使用Task.Delay,我在System.Threading.Tasks.Task命名空间中找不到它,因为我使用的是.Net Framework 4.0而不是4.5

有没有其他更好的解决方案适用于4.0.

c# multithreading .net-4.0

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

延迟文本更改事件一秒wpf

我有一个事件(ctc)在ComboBox中发生文本更改时触发,我想将其触发延迟一秒钟.我到目前为止编写了这段代码并将其放入MainWindow:

Timer aTimer = new Timer();
    aTimer.Interval = 1000;
    aTimer.Elapsed += new ElapsedEventHandler(ctc);
    aTimer.Enabled = true;
Run Code Online (Sandbox Code Playgroud)

我是WPF的新手,我想知道在ElapsedEventHandler括号中放什么,我把偶数名称但是我收到了错误.我还需要为ComboBox的Xaml代码添加任何内容吗?

c# wpf xaml

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