我想安排一个任务以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)
但我觉得应该有一个更好的方法,因为这会在睡眠中耗尽一个线程,在此期间它可以被取消.
我还有什么其他选择?
我的一位同事写了一些代码,这些代码在进行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)
它似乎有效,但由于某种原因,我对它的实现有一些担忧.是否有更好的方法来延迟?
注意:
我原以为这个问题是一个很好的选择,但是他并没有接受它,并说这不是他所做的工作所必需的.
如果同步方法执行时间太长,我正在寻找一种有效的方法来抛出超时异常.我见过一些样品,但没有什么能完全符合我的要求.
我需要做的是
我不是要终止同步方法,如果执行时间过长.(多次故障会使断路器跳闸并防止级联故障)
到目前为止我的解决方案如下所示.请注意,我确实将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#项目,希望在一个程序中做一个小的暂停约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) 我的System.Threading.Task上没有.Delay定义.
public async Task<string> WaitAsynchronouslyAsync()
{
await Task.Delay(10000);
return "Finished";
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个利用异步/等待功能集的可移植类库(.NET 4.5/Silverlight 5/Win Phone 8/WinRT).我发现我需要包含Microsoft.Bcl.Async
NuGet包才能使这个功能正常工作,所以我做到了这一点.显然由于我的目标,我无法访问Task.Delay(0)
或Task.FromResult(0)
.我想知道下一个最好的选择是什么?
目前,我正在使用:( new Task(() => { })
基本上,一个不执行任何操作的任务.)
我不确定这是否与前面提到的模式中的任何一个最佳等效.
更新:显然我是盲目的,并没有TaskEx
在我的intellisense菜单中看到.我打开这个问题所以人们知道它就在那里,只是因为我的intellisense自动完成而容易错过TaskExtensions
.
.net c# base-class-library async-await portable-class-library
在任务中使用Thread.Sleep()是否正确.或者只是一个与任务一起使用的计时器(.Net 4.5和后者中的Task.Delay())?或者可能存在另一种方法.
我有一个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.
我有一个事件(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# ×9
.net ×3
.net-4.0 ×2
.net-4.5 ×1
async-await ×1
asynchronous ×1
c#-4.0 ×1
delay ×1
pause ×1
thread-sleep ×1
wpf ×1
xaml ×1