Task Factory

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.

0

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

await Task.Run(()=>LoadData(req));
MyTaskCompleted(req);
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();
	}
} 
0

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

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ę.

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