第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

從后臺(tái)進(jìn)程打開窗口并在 WPF 中獲取用戶的輸入

從后臺(tái)進(jìn)程打開窗口并在 WPF 中獲取用戶的輸入

C#
精慕HU 2023-07-22 16:45:40
在我的 C# WPF 應(yīng)用程序中,我使用 BackgroundWorker 執(zhí)行某些異步報(bào)告工作。我可以使用 ProgressChanged 事件從 backgroundWorker 更新 UI。但是,我需要在此過程中請(qǐng)求用戶輸入,在后臺(tái)進(jìn)程的某些點(diǎn)上,我需要打開窗口詢問用戶輸入,根據(jù)該輸入,后臺(tái)進(jìn)程將進(jìn)一步繼續(xù)。我可以從后臺(tái)進(jìn)程打開某個(gè)窗口,然后在用戶對(duì)該窗口做出響應(yīng)后繼續(xù)該過程嗎?
查看完整描述

2 回答

?
aluckdog

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超7個(gè)贊

您應(yīng)該將其分成不同的后臺(tái)工作人員。當(dāng)您的流程到達(dá)需要用戶輸入的點(diǎn)時(shí),完成/完成您的后臺(tái)工作程序,然后收集 UI 線程上的輸入,然后使用該輸入啟動(dòng)下一個(gè)工作程序。


我建議使用任務(wù)/異步/等待方法來代替后臺(tái)工作人員。這將使這種過程更容易編寫和理解:


private void async RunTheJob()

{

    // Run Part1 async and wait for the result

    var result1 = await Part1();


    // Now collect your UI input based on result1

    var uiInput = ......;


    // Run Part2 async and wait for the result

    var result2 = await Part2(uiInput);

}


private Task<Part1ReturnObjectTypeHere> Part1()

{

    Part1ReturnObjectTypeHere result = null;

    ...do async work here to populate result...

    return result;

}


查看完整回答
反對(duì) 回復(fù) 2023-07-22
?
慕田峪7331174

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個(gè)贊

你基本上有兩個(gè)選擇:

  1. (最佳實(shí)踐)正如其他人所指出的,最佳實(shí)踐是使用 async/await 鏈來異步完成工作,而不是后臺(tái)工作人員。您只需將所有后臺(tái)作業(yè)代碼放入異步方法中并使用await 關(guān)鍵字調(diào)用它即可。

下面是一個(gè)示例,可用于提示無限數(shù)量的提示并隨后繼續(xù)作業(yè)。

? ? //You can bind this to a Button or any other WPF event,

? ? // the point is that it should be run from UI thread

? ? private async void JobStartEvent()

? ? {

? ? ? ? JobResult jobResult = new JobResult

? ? ? ? {

? ? ? ? ? ? JobStatus = JobStatus.NotStarted

? ? ? ? };

? ? ? ? while (jobResult.JobStatus != JobStatus.Done)

? ? ? ? {

? ? ? ? ? ? jobResult = await DoLongJob(jobResult.ContinuationInfo);


? ? ? ? ? ? if (jobResult.JobStatus == JobStatus.UserPromptRequired)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? jobResult.ContinuationInfo.PromptResult = PromptAndGetResult(jobResult.PromptInfo);

? ? ? ? ? ? }

? ? ? ? }

? ? }


? ? private async Task<JobResult> DoLongJob(JobContinuationInfo continuationInfo)

? ? {

? ? ? ? //Do long stuff here

? ? ? ? // continue the job using "continuationInfo"


? ? ? ? //When prompt needed, Do:

? ? ? ? {

? ? ? ? ? ? return new JobResult

? ? ? ? ? ? {

? ? ? ? ? ? ? ? JobStatus = JobStatus.UserPromptRequired,

? ? ? ? ? ? ? ? PromptInfo = new PromptInfo(), //Fill with information required for prompt

? ? ? ? ? ? ? ? ContinuationInfo = new ContinuationInfo() //Fill with information required for continuing the job (can be a delegate to a local function to continue the job)

? ? ? ? ? ? };

? ? ? ? }


? ? ? ? //When done, Do:

? ? ? ? {

? ? ? ? ? ? return new JobResult { JobStatus = JobStatus.Done};

? ? ? ? }

? ? }


? ? private async JobResult DoLongJob()

? ? {

? ? ? ? return JobResult =?

? ? }


? ? private enum JobStatus

? ? {

? ? ? ? NotStarted,

? ? ? ? UserPromptRequired,

? ? ? ? Done

? ? }


? ? internal class JobContinuationInfo

? ? {

? ? ? ? public PromptResult PromptResult { get; set; }

? ? ? ? // Other properties to continue the job

? ? }


? ? private class JobResult

? ? {

? ? ? ? public JobStatus JobStatus { get; set; }

? ? ? ? public PromptInfo PromptInfo { get; set; }

? ? ? ? public JobContinuationInfo ContinuationInfo { get; set; }

? ? }


了解更多: https: //learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/


要使用后臺(tái)工作程序,您可以使用 Dispatcher.Invoke 方法并將窗口創(chuàng)建代碼傳遞到那里。窗口創(chuàng)建將在 UI 線程中完成,但后臺(tái)工作線程將等待它執(zhí)行,獲取結(jié)果(可以是提示的結(jié)果),然后繼續(xù)執(zhí)行。

? ? System.Windows.Threading.Dispatcher.Invoke<ResultType>(async () =>

? ? {

? ? ? ? return PromptUserAndGetResult();

? ? });

查看完整回答
反對(duì) 回復(fù) 2023-07-22
  • 2 回答
  • 0 關(guān)注
  • 188 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)