Hi,
the problem with your code is that sayGood is actually a value and not a function. It is evaluated when it is declared (even before the taskBody2 task is created). The value assigned to "sayGood" is unit (because that's what the printfn function returns). The following code should clarify the problem:
Note that the "initializing..." string is printed before the "value of..." (because the value of "test") needs to be initialized during the let-binding. To correct this, you need to declare "sayGood" as a function (taking for example unit as an argument). Then you can call it from the lambda function passed as a parameter to task..
Also note that the WaitAll method takes a param-array of tasks that you want to wait for as a parameter (AFAIK calling it without parameters doesn't do anything).
the problem with your code is that sayGood is actually a value and not a function. It is evaluated when it is declared (even before the taskBody2 task is created). The value assigned to "sayGood" is unit (because that's what the printfn function returns). The following code should clarify the problem:
let test = printfn "initializing 'test'" 42 printfn "value of test: %d" test
Note that the "initializing..." string is printed before the "value of..." (because the value of "test") needs to be initialized during the let-binding. To correct this, you need to declare "sayGood" as a function (taking for example unit as an argument). Then you can call it from the lambda function passed as a parameter to task..
Also note that the WaitAll method takes a param-array of tasks that you want to wait for as a parameter (AFAIK calling it without parameters doesn't do anything).
// function taking string and returning unit
let sayHello englishText =
printfn "%s" englishText
Thread.Sleep(10000)
printfn "Again: %s" englishText
// a function taking unit and returning unit
let sayGood () = // note: added "()"
printfn "I am fine and you?"
Thread.Sleep(10000)
printfn "Again: you?"
// Note: we can pass lambda functions directly to StartNew
let t1 = Task.Factory.StartNew(fun () -> sayHello "Hello, World!")
let t2 = Task.Factory.StartNew(fun () -> sayGood ()) // pass unit as an argument here
Task.WaitAll(t1, t2);;
Hello, Tomasp:
Thank you very much for your code and good explanation.
However, I have tried your code for about 10 times, each time, the t2 seems run before t1. (I mean the order of the first printfn statement for each task)
I think the order of which task appears first should be random, right?
Thanks,
Thank you very much for your code and good explanation.
However, I have tried your code for about 10 times, each time, the t2 seems run before t1. (I mean the order of the first printfn statement for each task)
I think the order of which task appears first should be random, right?
Thanks,
For me, I would expect random order but would not mind even if one always run first. So long there is a way for me to sequence the task(you may need to check the library).
Just from the code, I would say the sequence is 'undefined' so there is no contract saying which may be run first, completely up to the implementation.
Just from the code, I would say the sequence is 'undefined' so there is no contract saying which may be run first, completely up to the implementation.
Topic tags
- f# × 3663
- compiler × 263
- functional × 199
- websharper × 120
- c# × 119
- classes × 96
- web × 94
- book × 84
- .net × 82
- async × 72
- parallel × 43
- server × 43
- parsing × 41
- testing × 41
- asynchronous × 30
- monad × 28
- ocaml × 26
- tutorial × 26
- haskell × 25
- workflows × 22
- html × 21
- linq × 21
- introduction × 19
- silverlight × 19
- wpf × 19
- fpish × 18
- collections × 14
- pipeline × 14
- templates × 12
- monads × 11
- opinion × 10
- reactive × 10
- plugin × 9
- scheme × 9
- sitelets × 9
- solid × 9
- basics × 8
- concurrent × 8
- deployment × 8
- how-to × 8
- python × 8
- complexity × 7
- javascript × 6
- jquery × 6
- lisp × 6
- real-world × 6
- workshop × 6
- xaml × 6
- conference × 5
- dsl × 5
- java × 5
- metaprogramming × 5
- ml × 5
- scala × 5
- visual studio × 5
- formlets × 4
- fsi × 4
- lift × 4
- sql × 4
- teaching × 4
- alt.net × 3
- aml × 3
- enhancement × 3
- list × 3
- reflection × 3
- type provider × 3
- blog × 2
- compilation × 2
- computation expressions × 2
- corporate × 2
- courses × 2
- cufp × 2
- enterprise × 2
- entity framework × 2
- erlang × 2
- events × 2
- f# interactive × 2
- fsc × 2
- google maps × 2
- html5 × 2
- http × 2
- interactive × 2
- interface × 2
- iphone × 2
- iteratee × 2
- jobs × 2
- kendo × 2
- keynote × 2
- mvc × 2
- numeric × 2
- obfuscation × 2
- oop × 2
- packaging × 2
- pattern matching × 2
- pipelines × 2
- rx × 2
- script × 2
- seq × 2
- sockets × 2
- stm × 2
- tcp × 2
- trie × 2
- type × 2
- xna × 2
- zh × 2
- .net interop × 1
- 2012 × 1
- abstract class × 1
- accumulator × 1
- active pattern × 1
- addin × 1
- agents × 1
- agile × 1
- alter session × 1
- android × 1
- anonymous object × 1
- appcelerator × 1
- architecture × 1
- array × 1
- arrays × 1
- asp.net 4.5 × 1
- asp.net mvc × 1
- asp.net mvc 4 × 1
- asp.net web api × 1
- aspnet × 1
- ast × 1
- b-tree × 1
- bistro × 1
- bug × 1
- camtasia studio × 1
- canvas × 1
- class × 1
- client × 1
- clojure × 1
- closures × 1
- cloud × 1
- cms × 1
- coding diacritics × 1
- color highlighting × 1
- combinator × 1
- confirm × 1
- constructor × 1
- continuation-passing style × 1
- coords × 1
- coursera × 1
- csla × 1
- css × 1
- current_schema × 1
- data × 1
- database × 1
- declarative × 1
- delete × 1
- dhtmlx × 1
- discriminated union × 1
- distance × 1
- docs × 1
- documentation × 1
- dol × 1
- domain × 1
- du × 1
- duf-101 × 1
- eclipse × 1
- edsl × 1
- em algorithm × 1
- emacs × 1
- emotion × 1
- error × 1
- etw × 1
- euclidean × 1
- event × 1
- example × 1
- examples × 1
- ext js × 1
- extension methods × 1
- extra × 1
- facet pattern × 1
- fantomas × 1
- fear × 1
- float × 1
- fp × 1
- frank × 1
- fsdoc × 1
- fsharp.core × 1
- fsharp.powerpack × 1
- fsharpx × 1
- function × 1
- functional style × 1
- gc × 1
- generic × 1
- geometry × 1
- getlastwin32error × 1
- google × 1
- group × 1
- hash × 1
- history × 1
- hosting × 1
- httpcontext × 1
- https × 1
- hubfs × 1
- ie 8 × 1
- if-doc × 1
- inheritance × 1
- installer × 1
- interpreter × 1
- io × 1
- ios × 1
- ipad × 1
- kendochart × 1
- kendoui × 1
- learning × 1
- licensing × 1
- macro × 1
- macros × 1
- maps × 1
- markup × 1
- marshal × 1
- math × 1
- metro style × 1
- micro orm × 1
- minimum-requirements × 1
- multidimensional × 1
- multithreading × 1
- mysql × 1
- mysqlclient × 1
- nancy × 1
- nested × 1
- nested loops × 1
- node × 1
- object relation mapper × 1
- object-oriented × 1
- offline × 1
- option × 1
- orm × 1
- osx × 1
- owin × 1
- paper × 1
- parameter × 1
- performance × 1
- persistent data structure × 1
- phonegap × 1
- pola × 1
- powerpack × 1
- prefix tree × 1
- principle of least authority × 1
- programming × 1
- projekt_feladat × 1
- protected × 1
- provider × 1
- ptvs × 1
- quant × 1
- quotations × 1
- range × 1
- raphael × 1
- razor × 1
- rc × 1
- real-time × 1
- reference × 1
- restful × 1
- round table × 1
- runtime × 1
- scriptcs × 1
- scripting × 1
- service × 1
- session-state × 1
- sitelet × 1
- sqlentityconnection × 1
- stickynotes × 1
- stress × 1
- strong name × 1
- structures × 1
- tdd × 1
- template × 1
- tracing × 1
- tsunamiide × 1
- type inference × 1
- type providers × 1
- typescript × 1
- upload × 1
- vb × 1
- vb.net × 1
- vector × 1
- visual f# × 1
- visual studio 11 × 1
- visual studio 2012 × 1
- visual studio shell × 1
- visualstudio × 1
- web api × 1
- webapi × 1
- windows 7 × 1
- windows 8 × 1
- windows-phone × 1
- winrt × 1
- xml × 1
- zarovizsga × 1
|
Copyright (c) 2011-2012 IntelliFactory. All rights reserved. Home | Products | Consulting | Trainings | Blogs | Jobs | Contact Us |
Built with WebSharper |
I want to learn Parallel Programming using F#.
I have the following code:
open System open System.Threading open System.Threading.Tasks let sayHello englishText = printfn "%s" englishText Thread.Sleep(10000) printfn "Again: %s" englishText let sayGood = printfn "I am fine and you?" Thread.Sleep(10000) printfn "Again: you?" let taskBody1 = new Action(fun () -> sayHello "Hello, World!") Task.Factory.StartNew(taskBody1) let taskBody2 = new Action(fun () -> sayGood ) Task.Factory.StartNew(taskBody2) Task.WaitAll();;However, each time, when I run it, I got the same result:
It seems the second task (sayGood) always runs before the first task(sayHello). And after it finishes, the F# shows the value of the functions; then the first task runs.
But I think if it is "real" parallel, then the first printfn of first task(sayHello) should appear before the second printfn of the second task(sayGood).
If I am wrong, please tell me, why it is in this case.
Or let me know how I can change my code to make it looks like parallel.
Thanks,