最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中ManualResetEvent實(shí)現(xiàn)線程的暫停與恢復(fù)

 更新時(shí)間:2022年01月20日 11:35:29   作者:chester·chen  
本文主要介紹了C#中ManualResetEvent實(shí)現(xiàn)線程的暫停與恢復(fù),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

背景

前些天遇到一個(gè)需求,在沒(méi)有第三方源碼的情況下,刷新一個(gè)第三方UI,并且攔截到其ajax請(qǐng)求的返回結(jié)果。當(dāng)結(jié)果為AVALIABLE的時(shí)候,停止刷新并語(yǔ)音提示,否則繼續(xù)刷新。

分析這個(gè)需求,發(fā)現(xiàn)需要控制一個(gè)刷新循環(huán)的暫停與開(kāi)始,因此網(wǎng)上搜到了通過(guò)ManualResetEvent實(shí)現(xiàn)線程的暫停與恢復(fù)。

ManualResetEvent介紹

ManualResetEvent是一個(gè)通過(guò)信號(hào)機(jī)制,實(shí)現(xiàn)線程間狀態(tài)同步的類(lèi)。常用的方法有以下三個(gè):

  • WaitOne:阻止當(dāng)前線程,直到收到信號(hào)
  • Reset:將事件狀態(tài)設(shè)置為非終止?fàn)顟B(tài),導(dǎo)致線程阻止
  • Set:將事件狀態(tài)設(shè)置為終止?fàn)顟B(tài),從而允許繼續(xù)執(zhí)行一個(gè)或多個(gè)等待線程

實(shí)現(xiàn)設(shè)計(jì)

1.通過(guò)CefSharp的谷歌瀏覽器插件請(qǐng)求第三方網(wǎng)站

 2.具體交互邏輯如下

默認(rèn)開(kāi)啟一個(gè)線程,并通過(guò)WaitOne掛起,等待手動(dòng)開(kāi)始自動(dòng)刷新的指令
手動(dòng)通過(guò)Set方法發(fā)送開(kāi)始工作信號(hào)
執(zhí)行完面操作后,通過(guò)Reset將線程再次掛起,并等待Ajax結(jié)果,判斷Ajax結(jié)果,如果不等于AVALIABLE則再次恢復(fù)線程

? ? ? ? public Form1()
? ? ? ? {
? ? ? ? ? ? InitializeComponent();
? ? ? ? ? ? var setting = new CefSettings();
? ? ? ? ? ? setting.Locale = "zh-CN";
? ? ? ? ? ? setting.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36";
? ? ? ? ? ? // 避免頁(yè)面加載不出來(lái), 建議加上這句
? ? ? ? ? ? Cef.Initialize(setting);

? ? ? ? ? ? workerThread = new Thread(new ThreadStart(BeginListenWorkerAsync));
? ? ? ? ? ? workerThread.IsBackground = true;
? ? ? ? ? ? workerThread.Start();

? ? ? ? ? ? this.停止自動(dòng)監(jiān)聽(tīng)ToolStripMenuItem.Enabled = false;
? ? ? ? }

? ? ? ? private async void BeginListenWorkerAsync()
? ? ? ? {
? ? ? ? ? ? while (true)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? _eventBeginListenWorkList.WaitOne(); ?//1.默認(rèn)掛起線程,等待信號(hào)
? ? ? ? ? ? ? ? chromiumWebBrowser1.GetBrowser().MainFrame.ExecuteJavaScriptAsync(@"document.evaluate(""http://*[@id='root']/div[1]/div[2]/div/div[2]/div[1]/div[1]/div/div[1]/button"", document).iterateNext().click()");

? ? ? ? ? ? ? ? Thread.Sleep(1000);
? ? ? ? ? ? ? ? chromiumWebBrowser1.GetBrowser().MainFrame.ExecuteJavaScriptAsync(@"document.evaluate(""http://*[@id='root']/div[1]/div[2]/div/div[1]/div/div/div/div[2]/div[6]/div/button"", document).iterateNext().click()");
? ? ? ? ? ? ? ? _eventBeginListenWorkList.Reset(); //3.頁(yè)面執(zhí)行完相應(yīng)操作則再次掛起線程,等待ajax請(qǐng)求結(jié)果再判斷是否恢復(fù)線程
? ? ? ? ? ? }
? ? ? ? }

? ? ? ? private void 停止自動(dòng)監(jiān)聽(tīng)ToolStripMenuItem_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? this.開(kāi)始自動(dòng)監(jiān)聽(tīng)ToolStripMenuItem.Enabled = true;
? ? ? ? ? ? this.停止自動(dòng)監(jiān)聽(tīng)ToolStripMenuItem.Enabled = false;
? ? ? ? ? ? _eventBeginListenWorkList.Reset();
? ? ? ? ? ? StartListen = false;
? ? ? ? }

? ? ? ? private void 開(kāi)始自動(dòng)監(jiān)聽(tīng)ToolStripMenuItem_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? this.開(kāi)始自動(dòng)監(jiān)聽(tīng)ToolStripMenuItem.Enabled = false;
? ? ? ? ? ? this.停止自動(dòng)監(jiān)聽(tīng)ToolStripMenuItem.Enabled = true;
? ? ? ? ? ? _eventBeginListenWorkList.Set(); // 2.手動(dòng)通過(guò)Set發(fā)送信號(hào)恢復(fù)線程,讓其工作
? ? ? ? ? ? StartListen = true;
? ? ? ? }

3.現(xiàn)在我們需要定義RequestHandler來(lái)指定ResourceHandler攔截ajax請(qǐng)求

? ? ? ? private void Form1_Load(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? chromiumWebBrowser1.RequestHandler = new MyRequestHandler(this);
? ? ? ? ? ? chromiumWebBrowser1.Load("https://www.xxxxxxxx.com/");
? ? ? ? }

MyRequestHandler中需要指定自定義ResourceHandler

? ? public class MyRequestHandler : RequestHandler
? ? {
? ? ? ? Form1 _form;
? ? ? ? public MyRequestHandler(Form1 form)
? ? ? ? {
? ? ? ? ? ? _form = form;
? ? ? ? }
? ? ? ? public static string AuthorizationValue;
? ? ? ? protected override bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture,
? ? ? ? ? ? bool isRedirect)
? ? ? ? {
? ? ? ? ? ? // 先調(diào)用基類(lèi)的實(shí)現(xiàn),斷點(diǎn)調(diào)試
? ? ? ? ? ? return base.OnBeforeBrowse(chromiumWebBrowser, browser, frame, request, userGesture, isRedirect);
? ? ? ? }

? ? ? ? protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame,
? ? ? ? ? ? IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
? ? ? ? {
? ? ? ? ? ? Console.WriteLine(request.Url);
? ? ? ? ? ? if (request.Url.StartsWith("https://www.xxxxxxxxxxxxxxxx/api") && request.Headers.AllKeys.Contains("Authorization"))
? ? ? ? ? ? {
? ? ? ? ? ? ? ? AuthorizationValue = request.Headers["Authorization"];
? ? ? ? ? ? }

? ? ? ? ? ? return new MyResourceRequestHandler(_form);
? ? ? ? }
? ? }

4.最后ResourceRequestHandler攔截到ajax請(qǐng)求之后,如果結(jié)果不是AVALIABLE則通過(guò)StartListenFunc再次恢復(fù)線程

? ? public class MyResourceRequestHandler : ResourceRequestHandler
? ? {
? ? ? ? Form1 _form;
? ? ? ? public MyResourceRequestHandler(Form1 form)
? ? ? ? {
? ? ? ? ? ? _form = form;
? ? ? ? }
? ? ? ? private Dictionary<ulong, MemoryStreamResponseFilter> responseDictionary = new Dictionary<ulong, MemoryStreamResponseFilter>();
? ? ? ? protected override IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
? ? ? ? {
? ? ? ? ? ? var dataFilter = new MemoryStreamResponseFilter();
? ? ? ? ? ? responseDictionary.Add(request.Identifier, dataFilter);
? ? ? ? ? ? return dataFilter;
? ? ? ? }

? ? ? ? protected override void OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
? ? ? ? {
? ? ? ? ? ? MemoryStreamResponseFilter filter;
? ? ? ? ? ? if (responseDictionary.TryGetValue(request.Identifier, out filter))
? ? ? ? ? ? {
? ? ? ? ? ? ? ? var data = filter.Data;
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? if (request.Url.StartsWith("https://xxxxxxxxxxxxxxxxxxxx/oneapi"))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? var available = false;
? ? ? ? ? ? ? ? ? ? string s = System.Text.Encoding.UTF8.GetString(data, 0, data.Length);
? ? ? ? ? ? ? ? ? ? Console.WriteLine(s);
? ? ? ? ? ? ? ? ? ? if (!string.IsNullOrEmpty(s))
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? var responseData = JsonConvert.DeserializeObject<ScheduleResponse>(s);
? ? ? ? ? ? ? ? ? ? ? ? if (responseData != null && responseData.productPreviews != null)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? foreach (var item in responseData.productPreviews)
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (item.schedule != null && item.schedule.status != null && item.schedule.status.name == "AVAILABLE")
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? available = true;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Mp3Player.Play();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Action act = delegate () { _form.StopListen(); };
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _form.Invoke(act);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? if (!available && Form1.StartListen)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? Form1.StartListenFunc();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? filter.Dispose();
? ? ? ? ? ? }
? ? ? ? }
? ? }

 而StartListenFunc則是通過(guò)Set方法再次恢復(fù)了線程對(duì)ui的重復(fù)查詢

? ? ? ? public static void StartListenFunc()
? ? ? ? {
? ? ? ? ? ? _eventBeginListenWorkList.Set();
? ? ? ? ? ? StartListen = true;
? ? ? ? }

ManualResetEvent官方介紹如下

https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.manualresetevent?view=netframework-1.1

到此這篇關(guān)于C#中ManualResetEvent實(shí)現(xiàn)線程的暫停與恢復(fù)的文章就介紹到這了,更多相關(guān)C# 線程暫?;謴?fù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#中使用Interlocked進(jìn)行原子操作的技巧

    C#中使用Interlocked進(jìn)行原子操作的技巧

    使用.NET提供的Interlocked類(lèi)可以對(duì)一些數(shù)據(jù)進(jìn)行原子操作,看起來(lái)似乎跟lock鎖一樣,但它并不是lock鎖,它的原子操作是基于CPU本身的,非阻塞的,所以要比lock的效率高
    2016-12-12
  • C#實(shí)現(xiàn)改變DataGrid某一行和單元格顏色的方法

    C#實(shí)現(xiàn)改變DataGrid某一行和單元格顏色的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)改變DataGrid某一行和單元格顏色的方法,主要涉及DataGrid控件的添加與使用、數(shù)據(jù)源的綁定、單元格與行的獲取等操作。需要的朋友可以參考下
    2014-09-09
  • 10個(gè)C#程序員經(jīng)常用到的實(shí)用代碼片段

    10個(gè)C#程序員經(jīng)常用到的實(shí)用代碼片段

    如果你是一個(gè)C#程序員,那么本文介紹的10個(gè)C#常用代碼片段一定會(huì)給你帶來(lái)幫助,從底層的資源操作,到上層的UI應(yīng)用,這些代碼也許能給你的開(kāi)發(fā)節(jié)省不少時(shí)間。以下是原文:
    2015-09-09
  • C# 使用GDI繪制雷達(dá)圖的實(shí)例

    C# 使用GDI繪制雷達(dá)圖的實(shí)例

    這篇文章主要介紹了C# 使用GDI繪制雷達(dá)圖,本文通過(guò)一段實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • C#實(shí)現(xiàn)自定義FTP操作封裝類(lèi)實(shí)例

    C#實(shí)現(xiàn)自定義FTP操作封裝類(lèi)實(shí)例

    這篇文章主要介紹了C#實(shí)現(xiàn)自定義FTP操作封裝類(lèi),涉及C#操作FTP的連接、傳輸、下載等操作的實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-03-03
  • C#將Excel轉(zhuǎn)成PDF的方法

    C#將Excel轉(zhuǎn)成PDF的方法

    今天小編就為大家分享一篇關(guān)于C#將Excel轉(zhuǎn)成PDF的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • C#判斷本地文件是否處于打開(kāi)狀態(tài)的方法

    C#判斷本地文件是否處于打開(kāi)狀態(tài)的方法

    這篇文章主要介紹了C#判斷本地文件是否處于打開(kāi)狀態(tài)的方法,涉及C#操作文件的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-05-05
  • C#使用Socket實(shí)現(xiàn)服務(wù)器與多個(gè)客戶端通信(簡(jiǎn)單的聊天系統(tǒng))

    C#使用Socket實(shí)現(xiàn)服務(wù)器與多個(gè)客戶端通信(簡(jiǎn)單的聊天系統(tǒng))

    這篇文章主要介紹了C#使用Socket實(shí)現(xiàn)服務(wù)器與多個(gè)客戶端通信(簡(jiǎn)單的聊天系統(tǒng)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 使用Log4net進(jìn)行日志記錄

    使用Log4net進(jìn)行日志記錄

    本文詳細(xì)講解了使用Log4net進(jìn)行日志記錄的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • C#入門(mén)之結(jié)構(gòu)類(lèi)型Struct

    C#入門(mén)之結(jié)構(gòu)類(lèi)型Struct

    這篇文章介紹了C#入門(mén)之結(jié)構(gòu)類(lèi)型Struct,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05

最新評(píng)論

铜山县| 通城县| 柘城县| 龙海市| 普格县| 佛山市| 姚安县| 佛山市| 珲春市| 商洛市| 高唐县| 忻州市| 邵阳市| 垫江县| 满洲里市| 社会| 阿拉尔市| 正阳县| 亚东县| 垦利县| 同仁县| 乌鲁木齐市| 汶上县| 昭平县| 团风县| 开化县| 舒兰市| 丰县| 西贡区| 白水县| 临高县| 巴中市| 永福县| 调兵山市| 洱源县| 公安县| 马边| 鹰潭市| 邮箱| 盐源县| 两当县|