亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否可以使用 System.Threading.Timer 運行異步任務?

是否可以使用 System.Threading.Timer 運行異步任務?

C#
素胚勾勒不出你 2021-11-28 19:48:24
所以我正在使用線程計時器并希望每 10 秒運行一次任務。在這個異步任務方法中,我在其中運行其他任務。我嘗試使用 System.Threading.Timer 執行此操作。_taskTimer = new Timer(statusChecker.CheckStatus, autoEvent, 1000, 250);似乎您不能等待分配給它的功能。有解決辦法嗎?我已經多次用谷歌搜索這個問題,但所有出現的都是關于非異步解決方案的無關緊要的帖子。
查看完整描述

3 回答

?
海綿寶寶撒

TA貢獻1809條經驗 獲得超8個贊

對于此用例,您實際上并不需要計時器。這是每 x 秒連續調用一個函數的一種方法(在控制臺程序中):


class Program

{

    static Task statusCheckingTask;

    static void Main(string[] args)

    {

        statusCheckingTask = CheckStatusTask(10);

        Console.ReadLine();

    }


    static async Task CheckStatusTask(int delayInSeconds)

    {

        while (true)

        {

            await CheckStatus();

            await Task.Delay(TimeSpan.FromSeconds(delayInSeconds));

        }

    }


    static async Task CheckStatus()

    {

        Console.WriteLine("Checking status...");

        await Task.FromResult(0);

    }


}


查看完整回答
反對 回復 2021-11-28
?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

如果您想每 250 毫秒觸發一次狀態檢查,無論之前的嘗試結果如何,請使用以下命令:


while (true)

{

    Task.Run(() => statusChecker.CheckStatus(autoEvent));


    await Task.Delay(TimeSpan.FromSeconds(250));

}

如果您只想在上一次嘗試完成時觸發狀態檢查,請使用以下命令:


while (true)

{

    await statusChecker.CheckStatus(autoEvent);


    await Task.Delay(TimeSpan.FromSeconds(250));

}

兩種情況都假設statusChecker.CheckStatus返回一個Task對象,例如:


public async Task CheckStatus(object autoEvent)

{

    // some async status checking

}


查看完整回答
反對 回復 2021-11-28
?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

我建議使用 Microsoft 的 Reactive Framework (NuGet "System.Reactive" and add using System.Reactive.Linq;),然后你可以這樣做:


IObservable<bool> query =

    from n in Observable.Interval(TimeSpan.FromSeconds(10.0))

    from s in Observable.FromAsync(() => statusChecker.CheckStatus())

    select s;


IDisposable subscription =

    query.Subscribe(status =>

    {

        /* Do something with each `status` as it arrives */

    });

這假設.CheckStatus()返回Task<bool>.


這一切都是通過后臺線程完成的,并且是異步的。只需調用subscription.Dispose()停止間隔計時器。簡單的。


查看完整回答
反對 回復 2021-11-28
  • 3 回答
  • 0 關注
  • 296 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號