2016-04-21 23 views
-3

我希望運行寫入到文本塊中WPF如何使用Async和Await技術編寫函數?

private async Task<int> TASK_ClickthroughBuild(string server, int frame, int click) 
{ 
    if (server == "value") 
    { 
     CreativeCode.Inlines.Add(openScript + newLine); 
     CreativeCode.Inlines.Add("var " + click + " = '%%CLICK_URL_ESC%%%%DEST_URL%%';" + newLine); 
     CreativeCode.Inlines.Add("var " + frame + " = document.getElementById('" + frame + "');" + newLine); 
     CreativeCode.Inlines.Add(frame + ".href = " + click + ";" + newLine); 
     CreativeCode.Inlines.Add(closeScript); 
     PASSBACKframeINT = frame;    
    } 
    return PASSBACKframeINT; 
} 

上述函數返回一個整數值,並寫入代碼到文本塊的空隙功能。

這是第二個功能。

private async Task clickElementBuild() 
{ 
    CreativeCode.Inlines.Add("<a href='#' id='" + PASSBACKframeINT + "' target='_blank' class='" + PASSBACKwrapINT + "' >" + newLine); 
    CreativeCode.Inlines.Add("<div class='" + PASSBACKblockINT + "' id='" + overlayINT + "'></div>" + newLine); 
} 

第二個函數的代碼需要寫的文本塊代碼上面的第一個功能,而是取決於第一個函數的返回值來寫正確。

所以我需要以異步格式寫這個。我可以有指針或更好的方式來做到這一點?

謝謝

+12

Your title is bad。 –

+1

爲什麼你需要異步做到這一點?似乎一切都是同步的...... – Aron

+0

,因爲其他函數需要返回值才能將正確的值寫入文本塊。 PASSBACKframeINT第二個函數需要使用第二個函數文本行,而第二個函數文本行需要位於第一個函數的文本之上。 – KaiMHirst

回答

-3

已排序。基本上,返回值並使用Async首先等待返回的值。

-2

我假設你使用.NET 4.5,否則你會選擇Threading-Solution。

調用異步函數基本上告訴Mainthread將所有內容傳遞給Backgroundthread。

由於異步函數被調用,所以存在「軟數據一致性的風險」。就像你的情況一樣,或者用更簡單的話來說就是Forms.show()和Forms.showDialog()的類比。

有幾種方法可以繞過這一點。 線程解決這一JO​​IN與()或爲WaitAll() 和異步與System.Threading.Thread.Sleep(x)或一些人喜歡Application.DoEvents()

您可以將一個等待換背景 - 任務 - 您的代碼上方的條款 存在「軟數據一致性」的風險,或者將代碼放入Mainthread中。

如果您不熟悉異步功能。我推薦這個教程來使用它。

https://visualstudiomagazine.com/articles/2014/06/01/how-to-simplify-asynchronous-programming.aspx

+1

請勿使用線程。儘可能使用任務和異步/等待。此外,異步和等待不會啓動新線程。它是異步的,而不是「並行的」 –

+0

退出嘀嗒。我基本上說過。 – Maxwell

+3

不是。這是異步/等待最大的誤解之一。我不想讓操作系統後來感到困惑。 –