Task Lista eredmények megszerzése

Címkék
Task Lista eredmények megszerzése
2020-11-28T12:09:22+01:00
2020-11-28T15:46:00+01:00
2022-08-11T23:15:36+02:00
Gerambaday
Sziasztok!
ezzel próbálkoznék, eddig sikertelenül: 
public List<string> getResults() { List<string> resultList = new List<string>(); //List<Task> taskok = new List<Task>(); List<Task<string>> taskok = new List<Task<string>>(); Random rnd = new Random(); for (int i = 0; i < 10; i++) { //taskok.Add((Task<string>)Task.Run(() => { //taskok.Add(Task.Run(() => { // getOneRes(i); // Task.Delay(rnd.Next(1000)); //})); taskok.Add(getOneTask(i)); } //foreach(string egyRes in await Task.WhenAll(taskok)) //{ // resultList.Add(egyRes); //} //return resultList; return taskok.Select(x => x.Result).ToList(); } public async Task<string> getOneTask(int i) { await Task.Delay(100); return getOneRes(i); } public string getOneRes(int i) { //Csinál valamit és visszaadja a szöveget return "valami " + i.ToString() ; }
próbáltam úgy is, hogy külön Task-ba csomagoltam a getOneRes-t de csak vár és vár.  Hogy kellene ezt megoldanom?
Mutasd a teljes hozzászólást!
Várni vár, mert mivel nincsenek await-elve a taszkok, amikor elkéred a task.Result-ot, valószínű még nem fejeződött be.

.Result-ot amúgy is illik messziről kerülni manapság, szépen await-elj helyette.

Neked valami hasonlóra van szükésged:

Task.WaitAll(taskok.Select(async task => resultList.Add(await task)).ToArray());
Mutasd a teljes hozzászólást!

  • Próbáltam, de sajna most is deadlock vagy valamiért meghal a UI és nem történik semmi.
    Mutasd a teljes hozzászólást!
  • Látatlanban elég nehéz megmondani. Nagyjából összeraktam fiddle-ben: LINK
    Mutasd a teljes hozzászólást!
  • Pontosítok! Megoldottad a dolgot, Consol app-ban működik, de valamiért winforms-ban nem. teljes kód:

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace multipleTask { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public List<string> getResults() { List<string> resultList = new List<string>(); //List<Task> taskok = new List<Task>(); List<Task<string>> taskok = new List<Task<string>>(); Random rnd = new Random(); for (int i = 0; i < 10; i++) { //taskok.Add((Task<string>)Task.Run(() => { //taskok.Add(Task.Run(() => { // getOneRes(i); // Task.Delay(rnd.Next(1000)); //})); taskok.Add(getOneTask(i)); } //var res2 = Task.WhenAll(taskok).GetAwaiter().GetResult().ToList(); //var results = await Task.WhenAll(taskok).ConfigureAwait(false); //foreach (string egyRes in results) //{ // resultList.Add(egyRes); //} //return resultList; //return taskok.Select(x => x.Result).ToList(); Task.WaitAll(taskok.Select(async task => resultList.Add(await task)).ToArray()); return resultList; } public async Task<string> getOneTask(int i) { await Task.Delay(100); return getOneRes(i); } public string getOneRes(int i) { //Csinál valamit és visszaadja a szöveget return "valami " + i.ToString() ; } private void button1_Click(object sender, EventArgs e) { var res = getResults(); foreach(string oneres in res) { richTextBox1.Text += oneres; }
    } } }
    Formon egy Button és egy RTB
    Mit b....k el? 
    Hálásan köszi a fáradozásodért!
    Mutasd a teljes hozzászólást!
  • Hát, a WinForms az teljesen más tészta. A helyzet az hogy deadlockolsz, mert a

    Task.Delay(100)
    szinkron blokkolja a UI threadet. A Delay taszk viszont soha nem tud elvégződni, mivel a "visszacsatolása" is a UI theaden akar futni, ami viszont blokkolva van.

    Legegyszerűbb ha explicit külön threaden futtatod.

    private void button1_Click(object sender, EventArgs e)
    ezt tedd async-á

    majd

    var res = getResults();
    helyett legyen

    var res = await Task.Run(() => getResults());
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
Címkék
abcd