首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在特定时间间隔后完成任务的正确方法

在特定时间间隔后完成任务的正确方法
EN

Stack Overflow用户
提问于 2013-11-14 18:45:49
回答 1查看 200关注 0票数 1

我做了一个小的winform应用程序,每隔10分钟,应用程序就会截取桌面的屏幕截图,并使用webservice以base64解码格式发送。

我使用了计时器控件,它每10分钟触发一次,并使用后台工作程序来更新UI上最后一次发送的屏幕截图时间。

问题是,应用程序在一段时间后挂起,我做了一些谷歌搜索,发现任务并行库是长时间运行进程的正确方式。但我对第三方物流了解不多。

你能指导我如何在我的应用程序中实现第三方物流吗?请告诉我正确有效的方法。

代码是

代码语言:javascript
复制
void timer1_Tick(object sender, EventArgs e)
{
    timer1.Interval = 600000 ; //10mins
    backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new MethodInvoker(delegate { screenShotFunction(); }));
    }
    else
    {
        screenShotFunction();
    }
}

private void screenShotFunction()
{

    printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
    Graphics graphics = Graphics.FromImage(printscreen as Image);
    graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size);

    mainSendFunction();

}

private void mainSendFunction()
{

    try
    {
        //code for webservice and base64 decoding
    }
    catch (Exception)
    {

    }
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{

}
EN

回答 1

Stack Overflow用户

发布于 2013-11-14 21:50:56

我不是TPL方面的专家,但这应该可以做到:

首先创建一个方法来处理您的任务。

代码语言:javascript
复制
private async void ScreenShotTask()
{
    try
    {
        while (true)
        {
            _cancelToken.ThrowIfCancellationRequested();
            screenShotFunction();
            await Task.Delay(new TimeSpan(0, 0, 10, 0), _cancelToken);
        }
    }
    catch (TaskCanceledException)
    {
        // what should happen when the task is canceled
    }
}

我使用了await Task.Delay而不是Thread.Sleep,因为它可以取消。

这是您实际开始任务的方式:

代码语言:javascript
复制
private CancellationTokenSource _cancelSource;
private CancellationToken _cancelToken; // ScreenShotTask must have access to this
private void mainMethod()
{
    _cancelSource= new CancellationTokenSource();
    _cancelToken = cancelSource.Token;
    Task.Factory.StartNew(ScreenShotTask, _cancelToken, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}

以下是取消任务的方法:

代码语言:javascript
复制
_cancelSource.Cancel();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19975609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档