19 messaggi dal 13 maggio 2017
Salve a tutti,
sto utilizzando per la prima volta del semplice codice multithread, ma mi sono scontrato con un problema che non riesco a risolvere nè ho trovato esempi in rete.
Questo è il mio problema:
In un ciclo in codice vb.net, elaboro dei file di testo e per ogni elaborazione chiamo un async task : RunAsyncA(richiesta,).GetAwaiter().GetResult()

RunAsyncA è una routine scritta in C# che fa la chiamata in API e che sostanzialmente esegue questa riga di codice:
"HttpResponseMessage response = await client.PostAsJsonAsync(uriAPI, richiesta).ConfigureAwait(continueOnCapturedContext: false);"
( 'richiesta' è il parametro elaborato in vb.net e che viene inviato con un POST).
Nella prima iterazione del ciclo, la prima chiamata funziona regolarmente, ma già alla seconda iterazione, la chiamata genera una eccezione con questo errore: 'Questa istanza ha già avviato una o più richieste. Le proprietà possono essere modificate solo prima di inviare la prima richiesta. '
Credo di capire che il ciclo in vb.net richiama il task prima che sia terminato, passandogli altri parametri ed è questo, credo, che genera l'eccezione.
Dove sbaglio? C'è un modo per ovviare all'errore?
Grazie per l'attenzione
Vincenzo
135 messaggi dal 01 febbraio 2017
Ciao, per grandi linee dovresti implementare un meccanismo dentro Await che attenda la risposta della richiesta precedente, prima di lanciarne una seconda.
Dociamo che in questo caso pur essendo asincrono il pm in VB, poi pa rounine chiamata in Csharp non lo è.
Gino.

UNSTRING identifier-1 id-2 id-3
DELIMITED BY [ALL] OR [ALL] literal-1 lit-2
INTO {id-4 [DELIMITER IN id-5]
[COUNT IN id-6]}
[WITH POINTER id-7]
[TALLYING IN id-8]
[ON OVERFLOW imperative-statement-1]
[NOT ON OVERFLOW imper-2]
[END-UNSTRING]
19 messaggi dal 13 maggio 2017
Grazie per la tua risposta.
Scrivo solo oggi perché solo oggi ho risolto.
L'errore che commettevo era definire come static l'HttpClient fuori della procedura asincrona, per cui, tutte le volte che chiamavo HttpResponseMessage response = await client.PostAsJsonAsync(uriAPI, risposta).ConfigureAwait(continueOnCapturedContext: false);
veniva richiamato sempre lo stesso oggetto HttpClient, che, come mi riportava il messaggio di errore, 'Questa istanza ha già avviato una o più richieste'.
Definendo l'oggetto HttpClient dentro la procedura, ho risolto il problema. Spero di essere stato chiaro nella spiegazione.
Grazie ancora per la tua risposta, che in qualche maniera, rileggendola più volte, mi ha portato alla soluzione.
Vincenzo
135 messaggi dal 01 febbraio 2017
gottinga ha scritto:
Grazie per la tua risposta.
Scrivo solo oggi perché solo oggi ho risolto.
L'errore che commettevo era definire come static l'HttpClient fuori della procedura asincrona, per cui, tutte le volte che chiamavo HttpResponseMessage response = await client.PostAsJsonAsync(uriAPI, risposta).ConfigureAwait(continueOnCapturedContext: false);
veniva richiamato sempre lo stesso oggetto HttpClient, che, come mi riportava il messaggio di errore, 'Questa istanza ha già avviato una o più richieste'.
Definendo l'oggetto HttpClient dentro la procedura, ho risolto il problema. Spero di essere stato chiaro nella spiegazione.
Grazie ancora per la tua risposta, che in qualche maniera, rileggendola più volte, mi ha portato alla soluzione.
Vincenzo

Ottimo, sono contento di averti aiutato a risolvere.
Grazie per il feedback.

Gino.

UNSTRING identifier-1 id-2 id-3
DELIMITED BY [ALL] OR [ALL] literal-1 lit-2
INTO {id-4 [DELIMITER IN id-5]
[COUNT IN id-6]}
[WITH POINTER id-7]
[TALLYING IN id-8]
[ON OVERFLOW imperative-statement-1]
[NOT ON OVERFLOW imper-2]
[END-UNSTRING]

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.