GPT async, await i aplikacja okienkowa

0

Hej

Napotkałem taki problem z aplikacją którą popełniłem lata temu, a służyła mi do uzupełniania opisów produktowych w jakiejś tam bazie systemu epr. Aplikacja klasyczna windows forms, .net Framework 4.8.
Chciałem uprościć pracę i dorzucić generowanie tekstów z gpt, i mam problem taki, że tam gdzie robię await - aplikacja mi się zamraża :)
Dochodze do tej liniki gdzie jest await i cisza...

To samo w konsolowej chodzi i odpowiada.
Dlaczego tak się dzieje? Co i gdzie zgubiłem?

private void btn_gpt(object sender, EventArgs e)
{
    Task<string> task = Obsluga.SendChatGTPRequest(txt_gpt_question.Text, "sk-xxxxx");
    if (task != null)
    {
        txt_response.Text = task.Result;
    }
}
public async static Task<string> SendChatGTPRequest(string question, string apiKey)
{
...
using (var httpReq = new HttpRequestMessage(HttpMethod.Post, "https://api.openai.com/v1/completions"))
            {
                httpReq.Headers.Add("Authorization", $"Bearer {apiKey}");
                string requestString = JsonSerializer.Serialize(completionRequest);
                httpReq.Content = new StringContent(requestString, Encoding.UTF8, "application/json");

                using (HttpResponseMessage httpResponse = await httpClient.SendAsync(httpReq))
                {
                    if (httpResponse != null)
                    {
                        string responseString = await httpResponse.Content.ReadAsStringAsync();
                        if (httpResponse.IsSuccessStatusCode && !string.IsNullOrWhiteSpace(responseString))
                        {
                            completionResponse = JsonSerializer.Deserialize<CompletionResponse>(responseString);
                        }
                    }
                }
            }
...
}

0

Ej dobra, już sobie rozwiązałem xD

0

@obscurity: do taks.Result nie dochodziło, SendChatGTPRequest() nie zwracał nic

Zmieniłem

Task<string> task = Obsluga.SendChatGTPRequest(txt_gpt_question.Text, "sk-xxxxx");
na
var result = await Task.Run(() => Obsluga.SendChatGTPRequest(txt_gpt_question.Text, "sk-xxxxx"));
0

Dlaczego nie zrobisz awaita na wywołaniu metody Obsluga.SendChatGTPRequest
i nie przypiszesz wyniku do zmiennej typu string zamiast Task tylko tworzysz takie dziwne konstrukcje?

0
lukaszek016 napisał(a):

Dlaczego nie zrobisz awaita na wywołaniu metody Obsluga.SendChatGTPRequest
i nie przypiszesz wyniku do zmiennej typu string zamiast Task tylko tworzysz takie dziwne konstrukcje?

No właśnie nie wiem, ja to w tak podstawowym zakresie coś umiem, poprawiłem na chyba poprawnie :)
A jak powinno być wg Ciebie?

2

Zamiast robić

var result = await Task.Run(() => Obsluga.SendChatGTPRequest(txt_gpt_question.Text, "sk-xxxxx"));

bo generalnie to generuje pod spodem jak i w kodzie nie potrzebnie dodatkową ilość kodu i zwyczajnie brzydko wygląda, bo robisz dwa razy to samo
to zrób tak:

var result = await Obsluga.SendChatGTPRequest(txt_gpt_question.Text, "sk-xxxxx");

jako, że twoja metoda zwraca Taska to możesz ją zawaitować

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.