Task Factory

Odpowiedz Nowy wątek
2013-12-28 12:12
0

Witam

Jak przekazać wartość zmiennej req metody MyTaskCompleted ?

Request req = new Request { Url = "http://jakis.adres" };
Task.Factory.StartNew(() => LoadData(req)).ContinueWith(MyTaskCompleted, TaskScheduler.FromCurrentSynchronizationContext());

Znalazłem odpowiedź. Powinno być jak niżej.
Post do skasowania (wg uznania moderatora)

Task.Factory.StartNew(() => LoadData(req)).ContinueWith((t) => MyTaskCompleted(req), TaskScheduler.FromCurrentSynchronizationContext());
void  MyTaskCompleted(Request req)
{
}
 

Zapisywałem () => MyTaskCompleted(req) i wywalało błąd.

edytowany 4x, ostatnio: shifttab, 2013-12-28 13:41

Pozostało 580 znaków

2013-12-28 15:19
0

Jeśli masz VS2012 to znacznie przejrzyściej będzie

await Task.Run(()=>LoadData(req));
MyTaskCompleted(req);
edytowany 1x, ostatnio: Azarien, 2013-12-28 15:21

Pozostało 580 znaków

2013-12-28 18:05
0

Mam 2013 express.
Dodałem jeszcze możliwość zakończenia zadania.

req = new Request() ;
await Task.Run(() => LoadData(req), req.CToken);
MyTaskCompleted(req);
 
public class Request
{
    public string Url { get; set; }
    public byte[] Result { get; set; }
    private CancellationTokenSource cts = new CancellationTokenSource();
    public CancellationToken CToken { get { return cts.Token; } }
    public void CancelRequest()
    {
        cts.Cancel();
    }
} 
edytowany 1x, ostatnio: shifttab, 2013-12-28 18:05

Pozostało 580 znaków

2013-12-28 19:38
0

Ale co tam masz w tym LoadData? bo może wcale nie trzeba tego tak opakowywać.
klasa Request też wydaje mi się nadmiarowa.

Pozostało 580 znaków

2013-12-28 22:05
0
Azarien napisał(a):

Ale co tam masz w tym LoadData? bo może wcale nie trzeba tego tak opakowywać.
klasa Request też wydaje mi się nadmiarowa.

Żeby odpowiedź miała sens, w LoadData musiałoby być coś, co nie działa asynchronicznie, jak sądzę :)

Trochę pozmieniam jednak kod.

public class Request
{
    public string Url { get; set; }
    public string Result { get; set; }
}
 
void Start()
{
LoadData("www.1");
LoadData("www.2");
LoadData("www.3");
}
 
void LoadData(string url)
{
Request req = new Request() { Url = url };
req.Result = new HttpClient().GetAsync(url).Result.Content.ReadAsStringAsync().Result;
MyTaskCompleted(req);
}
 
private void MyTaskCompleted(Request req)
{
// w zależności od adresu wykonuję jakieś działania
}

Nie wiem natomiast jak zatrzymać pobieranie.
W HttpClient jest metoda CancelPendingRequests(), ale kiedy ją wywołuję pobieranie nie przerywa się.

Pozostało 580 znaków

2013-12-29 02:31
Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0