Search Results

Search found 31716 results on 1269 pages for 'default action'.

Page 567/1269 | < Previous Page | 563 564 565 566 567 568 569 570 571 572 573 574  | Next Page >

  • Need help translating rate limiting iptables rules to Puppet format

    - by geoffroy
    I use Puppet Iptables module to manage Iptables rules on my machine. I'd like to implement to rate limit failed SSH connections as described here : Hundreds of failed ssh logins iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --name SSH --rsource -j DROP iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH --rsource -j ACCEPT Is it possible to translate it to Puppet syntax, such as firewall { '015 drop 5 failed attemps to connect to SSH in a minute ': proto => 'tcp', port => 22, action => 'drop', // what are the other paramters ? } Any help welcome. Best regards Geoffroy

    Read the article

  • Free batch image watermarking software

    - by Blade
    Hi everyone. I'm looking for a simple yet effective software to watermark a lot of photos in batch. I have to apply a transparent png watermark image on 400 photos. The program have to place the watermark at a custom position relative to the bottom right corner of every picture. I would have done this in photoshop, but the scriptable action doesn't allow me to do conditionnal placing if the photo is portrait or landscape. I'm looking for a free lightweigh program. Thank you !

    Read the article

  • Get name (address) of computer from which from which SSH login was made.

    - by amicitas
    After logging onto a linux machine via SSH, I would like to be able to retrieve the name of the computer from which the connection was made. Ideally I am looking for some command like hostname or uname but that would retrieve the name of the client instead of the host. This information must be accessible somewhere, since when I log on I get a message that contains the clinent name from the last login: Last login: Thu Mar 11 18:42:01 2010 from my.address.com The reason for wanting to do this is to be able to take different action in my .login file depending on which computer I am using for connection is from.

    Read the article

  • DVD/CD-ROM drives stop working in Windows 7

    - by Marcus L
    All of a sudden Windows 7 (64 bit) lost all DVD and CD-ROM drives. It worked fine for about a month, then I don't know what happened. At first I thought it was a hardware problem - that my DVD-ROM had malfunctioned. But then I realized that Windows 7 no longer picked up on Demon Tools drives either. I can boot both Windows installation and Knoppix from the DVD-drive. So it seems to be a general problem with "disc-media". When trying to reinstall the hardware DVD-ROM Windows recognizes the drive (though sometimes simply label it as "CD-ROM drive"), but then says something went wrong - with from what I understand is a default error message (39), claiming the driver has become corrupt. I've tried every Microsoft recommended action, i.e. uninstall, reinstall, look for driver updates etc. etc., but with no luck. Any tip most welcome!

    Read the article

  • can't delete files on Windows 7 (permission)

    - by lajos
    I updated my laptop from XP to Windows 7. There are some leftover files from XP on the computer now, when I try deleting them I get an error: You need permission to perform this action. You require permission from S-1-.... to make changes to this folder. What's weird is that I am logged in with the only user account on this machine and I have administrator privileges. I tried turning UAC off, but still can't delete the files. How can I force removal of these files?

    Read the article

  • Screen tail -f window closes immediately

    - by t.heintz
    I have this in my ~/.screenrc file: startup_message off screen -t top 0 top screen -t log 2 tail -f /path/to/application/log/* screen -t action 1 #caption always "%?%F%{.R.}%?%3n %t%? [%h]%?" hardstatus alwayslastline "%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%<" When I start screen, it opens all three windows, but as soon as I try to switch to window 2, it closes immediately. I would assume there is a problem with the shell and it exits instantly, but I can't find anything wrong with it. I have tried using quotation marks around the path and the entire command, which only leads to "file not found" errors. The command works just fine when I enter it directly into a shell. The screen version is: Screen version 4.00.02 (FAU) 5-Dec-03 Help?

    Read the article

  • Unable to move or delete files

    - by Erik
    Hi: Just today I got the following error while trying to move/delete several files: The action can't be completed because the file is open in another program. The file wasn't open, but just in case, I closed all programs. When that failed to allow me to move or delete the file, I restarted the computer. When that failed to let me move/delete I came here. Any suggestions? The files can be copy/pasted but move/delete fails even after multiple restarts.

    Read the article

  • How to find full/real email address from Lotus Notes?

    - by DA
    Is there any way to get the full set of email addresses? Example: I receive an email sent to a Lotus group 'all department employees'. I'd like to be able to grab the actual email addresses contained within (not their Lotus user name) so that I could email everyone from a client other than Lotus. Does such an option exist? I believe this was doable in Exchange with a right-click and 'expand nickname' type of action. I'm on a Mac.

    Read the article

  • Firefox addon to display all shortucts

    - by p1
    Is there a firefox addon that would display all shortcuts on a web page and also browser shortcuts. for eg: c is the keyboard shortcut for gmail compose. So either on a particular key combination or by hovering over the compose button it should show a "c" to indicate there is a shortcut for this operation. I guess If we keep on seeing the shortcuts popping each time when we do an action then we can start using and remembering more and more of it. Thanks. P.S: If this is not the forum to ask this question please suggest appropriately in comments.

    Read the article

  • Is there a way to pin a virtual PC VHD to the Windows 7 taskbar?

    - by Corey
    I have a virtual HD for Windows XP mode, and wanted to pin it to the task bar. However, trying to pin the shortcut to the VHD file actually pins the "virtual machines" folder instead. Clicking on it opens the explorer window and I have to click on the VHD to actually open Windows XP. It does know I'm trying to pin the file, and if I right-click the taskbar icon, has the file under "pinned," but the default action is what's under "Task" (which is to open the virtual machines folder in explorer). Is there a way to pin the actual VHD to the taskbar, so it's just one click to restore the virtual machine?

    Read the article

  • filtering itunes library items by file location

    - by Cawas
    The Problem I've got way more than 1000 duplicated items in my iTunes Library pointing to a non-existant place (the "where" under "get info" window), along with other duplicated items and other MIAs (Missing In Action). Is there any simple way to just delete all of them and only them? By that I mean some MIAs are pointing to /Volumes while some are pointing to .../music/Music/... or just .../music/.... I want to delete all pointing to /Volumes as to later I'll recover the rest. Check the image below. Some Background I tried searching for a specific key word on the path and creating smart play list, but with no result. Being able to just sort all library by path would be a perfect solution! I believe old iTunes could do that. PowerTunes can do it (sort by path) but I can't do anything with its list. Yes, all of the /Volumes look like that.

    Read the article

  • Users own mapped network drives disappear when I set a GPP mapped drive

    - by Kim
    All the clients use Windows 7 SP1 x64 Enterprise. The domain controllers are Windows Server 2008 R2. I have configured the GPP to map "\server\data" to first available drive letter starting with I:. The action is replace and I have set the Hide/Show this drive and Hide/Show all drives to "Show". I have set targeting to a specified security group. This works as expected and the drive is mapped to the correct users. The problem is that if the user has created their own mapped drives these mappings will disappear when the GPP mapping is applied. Only the mapped drives from the GPP is shown in Explorer. I have not found any other mention of this particular problem when I search the Internet and on TechNet there is no mention of what happens to drives already mapped.

    Read the article

  • How to configure LAMP server for iOS social/chat app?

    - by andufo
    I'm on the last developing phase of a social networking app for iOS that has a chat module. Right now I'm trying to figure out the best way to achieve these features: Send message instantly to another user. If other user is online, delivery should be instantly. If user reads the message, the remitent should be notified of that action. If a user visits my profile, I should be notified instantly. What would be, in your opinion, the best approach to achieve that experience? The server is CentOS 5.6. I've previously reviewed XMPP, sockets, but I'm still unsure on what the best approach is. Any opinions and resources will be much appreciated.

    Read the article

  • Thunderbird very slow with Gmail

    - by koskoz
    I'm using the latest version of Thunderbird with 3 Gmail accounts. Every time I launch it it seems it's downloading all my messages again. I've compacted folders (is the action working for the 3 accounts or do I need to do it for each of them?) and deleted the .msc files but nothing change. It leads to a software using a lot of bandwidth and being very slow when using it. It's a pain to write a message or even to view one. All the software is so slow I've never seen that it's almost unusable. I'm using thses addons : Dictionary Google Calendar Lightning My Gmail accounts are configured to imap.

    Read the article

  • The simple "cron" that killed the cloud hosting option

    - by ron M.
    My SaaS application required a nightly cron job to run, analyze a database, send out e-mails and do some database maintenance work. This job cannot be triggered by user action. Almost every 'cloud' hosting solution balks at this to the point where they tell me "we cannot do this". Is this feature so exotic that cloud hosting providers simply don't care about? Am I using the wrong lingo here? should I use another concept? Do I have to go with dedicated hosting where i have "root access" as the only solution to this?

    Read the article

  • Eclipse style autohotkey commands

    - by Ph4g3
    Is autohotkey capable of interpreting hotkeys in the style of Ctrl + Shift + W, W? I would assume a script like the following would work: ^+W:: ; Windows hotkeys (Ctrl + Shift + W) O:: Run Outlook ; Subsequent 'o' pressed => Run outlook E:: Run Explorer ; return From the documentation I note that these are called vertically stacked hotkeys and cause each line to perform the same action. In the case above, I think Ctrl+Shift+W and o will both cause outlook to be launched, whereas pressing e would cause explorer to be launched. What I would like is Ctrl+Shift+W, O runs outlook and Ctrl+Shift+W, e runs windows explorer. Is there any way to cause a hotkey to perform context specific actions (much like in Eclipse), where I can press Ctrl+Shift+W to activate a block of specific hotkeys?

    Read the article

  • Schedule robocopy run

    - by xeonet
    I have Windows Server 2008 Enterprise. I need to copy files from network folder, I connected as a Z: drive. I need to schedule the copy. In scheduler I run it every 5 minutes. robocopy.exe Z:\ C:\destination /E I've tried to put it to .bat file, tried to write in scheduler, it doesn't help. I've set run with highest privilegies... Task Scheduler successfully completed task "\RoboCopy" , instance "{dd2d2d1c-4ef1-4e30-b226-4a77aa52dab9}" , action "C:\Windows\SYSTEM32\cmd.exe" with return code 16.

    Read the article

  • SharePoint 3.0 Search Stuck Starting

    - by Skaughty
    I have a single server running SharePoint 3.0 on WS2003 Sp2 not on a domain. My search service stopped working so I just went in to central admin and hit stop, then hit start. I soon found out this is not the way to do this process. I now can not get the search service to start again. I have tried everything I can think of, and nothing works it changes status to Starting but never gets to started. I have to go in with "stsadm -o spsearch -action stop" from the command prompt to stop it. I am using the Local service account for the service and the content accounts. Can anyone help me?

    Read the article

  • web server and database server distance

    - by Erkan
    I want to seperate my server into two parts: web server and dbserver. My web server is located in Turkey and my dbserver is located in Germany. I cant change my web server because my agreement is based on my Ip adresses. I want to locate my dbserver in Germany because more cheap then Turkey. But... I have a problem in here. When you call a db action, first, you are going to Turkey for IIS and IIS is going to Germany for Dbserver. It is too far and so slow to response back. Any idea? Is it wrong that the distance is so far between web server and dbserver? Or Are there any solutions for this problem?

    Read the article

  • How to enable Integrated Load Balancing in Windows 8

    - by intodevelopment
    One of the cool new features many sites mention is "Integrated Load Balancing" in Windows 8. It is supposed to do the following: If you have multiple active network connections, Windows 8 will intelligently balance the network traffic between them for performance Source: Short: Some of what Microsoft didn’t show of Windows 8 I would love to see this feature in action. I am connected to a WiFi access point and to a different network by cable. Yet I don't see the operating system 'intelligently' balance the network load when for instance downloading multiple files. Is there any way to enable it or should I adjust my expectations?

    Read the article

  • Adding a hyperlink in a client report definition file (RDLC)

    - by rajbk
    This post shows you how to add a hyperlink to your RDLC report. In a previous post, I showed you how to create an RDLC report. We have been given the requirement to the report we created earlier, the Northwind Product report, to add a column that will contain hyperlinks which are unique per row.  The URLs will be RESTful with the ProductID at the end. Clicking on the URL will take them to a website like so: http://localhost/products/3  where 3 is the primary key of the product row clicked on. To start off, open the RDLC and add a new column to the product table.   Add text to the header (Details) and row (Product Website). Right click on the row (not header) and select “TextBox properties” Select Action – Go to URL. You could hard code a URL here but what we need is a URL that changes based on the ProductID.   Click on the expression button (fx) The expression builder gives you access to several functions and constants including the fields in your dataset. See this reference for more details: Common Expressions for ReportViewer Reports. Add the following expression: = "http://localhost/products/" & Fields!ProductID.Value Click OK to exit the Expression Builder. The report will not render because hyperlinks are disabled by default in the ReportViewer control. To enable it, add the following in your page load event (where rvProducts is the ID of your ReportViewerControl): protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { rvProducts.LocalReport.EnableHyperlinks = true; } } We want our links to open in a new window so set the HyperLinkTarget property of the ReportViewer control to “_blank”   We are done adding hyperlinks to our report. Clicking on the links for each product pops open a new windows. The URL has the ProductID added at the end. Enjoy!

    Read the article

  • ASP.NET MVC Paging/Sorting/Filtering using the MVCContrib Grid and Pager

    - by rajbk
    This post walks you through creating a UI for paging, sorting and filtering a list of data items. It makes use of the excellent MVCContrib Grid and Pager Html UI helpers. A sample project is attached at the bottom. Our UI will eventually look like this. The application will make use of the Northwind database. The top portion of the page has a filter area region. The filter region is enclosed in a form tag. The select lists are wired up with jQuery to auto post back the form. The page has a pager region at the top and bottom of the product list. The product list has a link to display more details about a given product. The column headings are clickable for sorting and an icon shows the sort direction. Strongly Typed View Models The views are written to expect strongly typed objects. We suffix these strongly typed objects with ViewModel since they are designed specifically for passing data down to the view.  The following listing shows the ProductViewModel. This class will be used to hold information about a Product. We use attributes to specify if the property should be hidden and what its heading in the table should be. This metadata will be used by the MvcContrib Grid to render the table. Some of the properties are hidden from the UI ([ScaffoldColumn(false)) but are needed because we will be using those for filtering when writing our LINQ query. public ActionResult Index( string productName, int? supplierID, int? categoryID, GridSortOptions gridSortOptions, int? page) {   var productList = productRepository.GetProductsProjected();   // Set default sort column if (string.IsNullOrWhiteSpace(gridSortOptions.Column)) { gridSortOptions.Column = "ProductID"; }   // Filter on SupplierID if (supplierID.HasValue) { productList = productList.Where(a => a.SupplierID == supplierID); }   // Filter on CategoryID if (categoryID.HasValue) { productList = productList.Where(a => a.CategoryID == categoryID); }   // Filter on ProductName if (!string.IsNullOrWhiteSpace(productName)) { productList = productList.Where(a => a.ProductName.Contains(productName)); }   // Create all filter data and set current values if any // These values will be used to set the state of the select list and textbox // by sending it back to the view. var productFilterViewModel = new ProductFilterViewModel(); productFilterViewModel.SelectedCategoryID = categoryID ?? -1; productFilterViewModel.SelectedSupplierID = supplierID ?? -1; productFilterViewModel.Fill();   // Order and page the product list var productPagedList = productList .OrderBy(gridSortOptions.Column, gridSortOptions.Direction) .AsPagination(page ?? 1, 10);     var productListContainer = new ProductListContainerViewModel { ProductPagedList = productPagedList, ProductFilterViewModel = productFilterViewModel, GridSortOptions = gridSortOptions };   return View(productListContainer); } The following diagram shows the rest of the key ViewModels in our design. We have a container class called ProductListContainerViewModel which has nested classes. The ProductPagedList is of type IPagination<ProductViewModel>. The MvcContrib expects the IPagination<T> interface to determine the page number and page size of the collection we are working with. You convert any IEnumerable<T> into an IPagination<T> by calling the AsPagination extension method in the MvcContrib library. It also creates a paged set of type ProductViewModel. The ProductFilterViewModel class will hold information about the different select lists and the ProductName being searched on. It will also hold state of any previously selected item in the lists and the previous search criteria (you will recall that this type of state information was stored in Viewstate when working with WebForms). With MVC there is no state storage and so all state has to be fetched and passed back to the view. The GridSortOptions is a type defined in the MvcContrib library and is used by the Grid to determine the current column being sorted on and the current sort direction. The following shows the view and partial views used to render our UI. The Index view expects a type ProductListContainerViewModel which we described earlier. <%Html.RenderPartial("SearchFilters", Model.ProductFilterViewModel); %> <% Html.RenderPartial("Pager", Model.ProductPagedList); %> <% Html.RenderPartial("SearchResults", Model); %> <% Html.RenderPartial("Pager", Model.ProductPagedList); %> The View contains a partial view “SearchFilters” and passes it the ProductViewFilterContainer. The SearchFilter uses this Model to render all the search lists and textbox. The partial view “Pager” uses the ProductPageList which implements the interface IPagination. The “Pager” view contains the MvcContrib Pager helper used to render the paging information. This view is repeated twice since we want the pager UI to be available at the top and bottom of the product list. The Pager partial view is located in the Shared directory so that it can be reused across Views. The partial view “SearchResults” uses the ProductListContainer model. This partial view contains the MvcContrib Grid which needs both the ProdctPagedList and GridSortOptions to render itself. The Controller Action An example of a request like this: /Products?productName=test&supplierId=29&categoryId=4. The application receives this GET request and maps it to the Index method of the ProductController. Within the action we create an IQueryable<ProductViewModel> by calling the GetProductsProjected() method. /// <summary> /// This method takes in a filter list, paging/sort options and applies /// them to an IQueryable of type ProductViewModel /// </summary> /// <returns> /// The return object is a container that holds the sorted/paged list, /// state for the fiters and state about the current sorted column /// </returns> public ActionResult Index( string productName, int? supplierID, int? categoryID, GridSortOptions gridSortOptions, int? page) {   var productList = productRepository.GetProductsProjected();   // Set default sort column if (string.IsNullOrWhiteSpace(gridSortOptions.Column)) { gridSortOptions.Column = "ProductID"; }   // Filter on SupplierID if (supplierID.HasValue) { productList.Where(a => a.SupplierID == supplierID); }   // Filter on CategoryID if (categoryID.HasValue) { productList = productList.Where(a => a.CategoryID == categoryID); }   // Filter on ProductName if (!string.IsNullOrWhiteSpace(productName)) { productList = productList.Where(a => a.ProductName.Contains(productName)); }   // Create all filter data and set current values if any // These values will be used to set the state of the select list and textbox // by sending it back to the view. var productFilterViewModel = new ProductFilterViewModel(); productFilterViewModel.SelectedCategoryID = categoryID ?? -1; productFilterViewModel.SelectedSupplierID = supplierID ?? -1; productFilterViewModel.Fill();   // Order and page the product list var productPagedList = productList .OrderBy(gridSortOptions.Column, gridSortOptions.Direction) .AsPagination(page ?? 1, 10);     var productListContainer = new ProductListContainerViewModel { ProductPagedList = productPagedList, ProductFilterViewModel = productFilterViewModel, GridSortOptions = gridSortOptions };   return View(productListContainer); } The supplier, category and productname filters are applied to this IQueryable if any are present in the request. The ProductPagedList class is created by applying a sort order and calling the AsPagination method. Finally the ProductListContainerViewModel class is created and returned to the view. You have seen how to use strongly typed views with the MvcContrib Grid and Pager to render a clean lightweight UI with strongly typed views. You also saw how to use partial views to get data from the strongly typed model passed to it from the parent view. The code also shows you how to use jQuery to auto post back. The sample is attached below. Don’t forget to change your connection string to point to the server containing the Northwind database. NorthwindSales_MvcContrib.zip My name is Kobayashi. I work for Keyser Soze.

    Read the article

  • apache2: Could not open configuration file /etc/apache2/apache2.conf: Permission denied

    - by AntonChanning
    I recently upgraded Ubuntu to the latest LTS edition on my work laptop, which I use as a LAMP development platform. The upgrade was from 12.4 to 14.4. Now I'm having trouble getting apache up and running again. Here is the output from an attempt: antonc@antonc-laptop:/etc/apache2$ sudo service apache2 restart * Restarting web server apache2 * The apache2 configtest failed. Output of config test was: apache2: Could not open configuration file /etc/apache2/apache2.conf: Permission denied Action 'configtest' failed. The Apache error log may have more information. Here is a list of permissions and ownership in /etc/apache, showing that apache2.conf is currently owned by root with permissions 644. I changed this temporarily to 777, but this made no difference, so I changed it back to 644. antonc@antonc-laptop:/etc/apache2$ ls -l total 80 -rw-r--r-- 1 root root 7115 Jan 7 2014 apache2.conf ... What do I need to do to get apache running again? Is the problem really with apache2.conf or some other setting? Should the conf file be owned by a user other than root?

    Read the article

  • Postgresql fails to start on Ubuntu 10.04.4 LTS

    - by cancerballs
    I installed postgresql 9.2 from add-apt-repository ppa:pitti/postgresql using apt-get install postgresql-9.2 At the end of the install and every time I try to launch postgresql by using the following command /etc/init.d/postgresql start or service postgresql start I get this error: Error: could not exec /usr/lib/postgresql/9.2/bin/pg_ctl /usr/lib/postgresql/9.2/bin/pg_ctl start -D /var/lib/postgresql/9.2/main -l /var/log/postgresql/postgresql-9.2-main.log -s -o -c config_file="/etc/postgresql/9.2/main/postgresql.conf" : [fail] invoke-rc.d: initscript postgresql, action "start" failed. dpkg: error processing postgresql-9.2 (--configure): subprocess installed post-installation script returned error exit status 1 Errors were encountered while processing: postgresql-9.2 E: Sub-process /usr/bin/dpkg returned an error code (1) I have tried everything found here: How to thoroughly purge and reinstall postgresql on ubuntu and here: Eliminating non working postgresql installations on ubuntu 10-04 and starting af. I have also done dpkg -P --force-remove-reinstreq postgresql-client-9.2 in my attempt to remove everything postgres related from my server. After removing postgresql I have used dpkg --get-selections | grep postg To be sure there is nothing left and I can do a clean install. I have also made sure that the files and folders mentioned in the error message have the right permissions. The /var/log/postgresql/postgresql-9.2-main.log file is empty. I have tried installing every postgresql version from 8.3 to 9.2 and I get the same error on every time. I once managed to compile postgresql from the source provided on their website but then I encountered weird errors with psycopg2 so I figured I'd install postgresql this way and avoid those errors. Also when I type apt-get install postgresql it by default tries to install the 8.3 version even when I can find the package by typing apt-get install postgresql-9.2.

    Read the article

  • Parallelism in .NET – Part 3, Imperative Data Parallelism: Early Termination

    - by Reed
    Although simple data parallelism allows us to easily parallelize many of our iteration statements, there are cases that it does not handle well.  In my previous discussion, I focused on data parallelism with no shared state, and where every element is being processed exactly the same. Unfortunately, there are many common cases where this does not happen.  If we are dealing with a loop that requires early termination, extra care is required when parallelizing. Often, while processing in a loop, once a certain condition is met, it is no longer necessary to continue processing.  This may be a matter of finding a specific element within the collection, or reaching some error case.  The important distinction here is that, it is often impossible to know until runtime, what set of elements needs to be processed. In my initial discussion of data parallelism, I mentioned that this technique is a candidate when you can decompose the problem based on the data involved, and you wish to apply a single operation concurrently on all of the elements of a collection.  This covers many of the potential cases, but sometimes, after processing some of the elements, we need to stop processing. As an example, lets go back to our previous Parallel.ForEach example with contacting a customer.  However, this time, we’ll change the requirements slightly.  In this case, we’ll add an extra condition – if the store is unable to email the customer, we will exit gracefully.  The thinking here, of course, is that if the store is currently unable to email, the next time this operation runs, it will handle the same situation, so we can just skip our processing entirely.  The original, serial case, with this extra condition, might look something like the following: foreach(var customer in customers) { // Run some process that takes some time... DateTime lastContact = theStore.GetLastContact(customer); TimeSpan timeSinceContact = DateTime.Now - lastContact; // If it's been more than two weeks, send an email, and update... if (timeSinceContact.Days > 14) { // Exit gracefully if we fail to email, since this // entire process can be repeated later without issue. if (theStore.EmailCustomer(customer) == false) break; customer.LastEmailContact = DateTime.Now; } } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Here, we’re processing our loop, but at any point, if we fail to send our email successfully, we just abandon this process, and assume that it will get handled correctly the next time our routine is run.  If we try to parallelize this using Parallel.ForEach, as we did previously, we’ll run into an error almost immediately: the break statement we’re using is only valid when enclosed within an iteration statement, such as foreach.  When we switch to Parallel.ForEach, we’re no longer within an iteration statement – we’re a delegate running in a method. This needs to be handled slightly differently when parallelized.  Instead of using the break statement, we need to utilize a new class in the Task Parallel Library: ParallelLoopState.  The ParallelLoopState class is intended to allow concurrently running loop bodies a way to interact with each other, and provides us with a way to break out of a loop.  In order to use this, we will use a different overload of Parallel.ForEach which takes an IEnumerable<T> and an Action<T, ParallelLoopState> instead of an Action<T>.  Using this, we can parallelize the above operation by doing: Parallel.ForEach(customers, (customer, parallelLoopState) => { // Run some process that takes some time... DateTime lastContact = theStore.GetLastContact(customer); TimeSpan timeSinceContact = DateTime.Now - lastContact; // If it's been more than two weeks, send an email, and update... if (timeSinceContact.Days > 14) { // Exit gracefully if we fail to email, since this // entire process can be repeated later without issue. if (theStore.EmailCustomer(customer) == false) parallelLoopState.Break(); else customer.LastEmailContact = DateTime.Now; } }); There are a couple of important points here.  First, we didn’t actually instantiate the ParallelLoopState instance.  It was provided directly to us via the Parallel class.  All we needed to do was change our lambda expression to reflect that we want to use the loop state, and the Parallel class creates an instance for our use.  We also needed to change our logic slightly when we call Break().  Since Break() doesn’t stop the program flow within our block, we needed to add an else case to only set the property in customer when we succeeded.  This same technique can be used to break out of a Parallel.For loop. That being said, there is a huge difference between using ParallelLoopState to cause early termination and to use break in a standard iteration statement.  When dealing with a loop serially, break will immediately terminate the processing within the closest enclosing loop statement.  Calling ParallelLoopState.Break(), however, has a very different behavior. The issue is that, now, we’re no longer processing one element at a time.  If we break in one of our threads, there are other threads that will likely still be executing.  This leads to an important observation about termination of parallel code: Early termination in parallel routines is not immediate.  Code will continue to run after you request a termination. This may seem problematic at first, but it is something you just need to keep in mind while designing your routine.  ParallelLoopState.Break() should be thought of as a request.  We are telling the runtime that no elements that were in the collection past the element we’re currently processing need to be processed, and leaving it up to the runtime to decide how to handle this as gracefully as possible.  Although this may seem problematic at first, it is a good thing.  If the runtime tried to immediately stop processing, many of our elements would be partially processed.  It would be like putting a return statement in a random location throughout our loop body – which could have horrific consequences to our code’s maintainability. In order to understand and effectively write parallel routines, we, as developers, need a subtle, but profound shift in our thinking.  We can no longer think in terms of sequential processes, but rather need to think in terms of requests to the system that may be handled differently than we’d first expect.  This is more natural to developers who have dealt with asynchronous models previously, but is an important distinction when moving to concurrent programming models. As an example, I’ll discuss the Break() method.  ParallelLoopState.Break() functions in a way that may be unexpected at first.  When you call Break() from a loop body, the runtime will continue to process all elements of the collection that were found prior to the element that was being processed when the Break() method was called.  This is done to keep the behavior of the Break() method as close to the behavior of the break statement as possible. We can see the behavior in this simple code: var collection = Enumerable.Range(0, 20); var pResult = Parallel.ForEach(collection, (element, state) => { if (element > 10) { Console.WriteLine("Breaking on {0}", element); state.Break(); } Console.WriteLine(element); }); If we run this, we get a result that may seem unexpected at first: 0 2 1 5 6 3 4 10 Breaking on 11 11 Breaking on 12 12 9 Breaking on 13 13 7 8 Breaking on 15 15 What is occurring here is that we loop until we find the first element where the element is greater than 10.  In this case, this was found, the first time, when one of our threads reached element 11.  It requested that the loop stop by calling Break() at this point.  However, the loop continued processing until all of the elements less than 11 were completed, then terminated.  This means that it will guarantee that elements 9, 7, and 8 are completed before it stops processing.  You can see our other threads that were running each tried to break as well, but since Break() was called on the element with a value of 11, it decides which elements (0-10) must be processed. If this behavior is not desirable, there is another option.  Instead of calling ParallelLoopState.Break(), you can call ParallelLoopState.Stop().  The Stop() method requests that the runtime terminate as soon as possible , without guaranteeing that any other elements are processed.  Stop() will not stop the processing within an element, so elements already being processed will continue to be processed.  It will prevent new elements, even ones found earlier in the collection, from being processed.  Also, when Stop() is called, the ParallelLoopState’s IsStopped property will return true.  This lets longer running processes poll for this value, and return after performing any necessary cleanup. The basic rule of thumb for choosing between Break() and Stop() is the following. Use ParallelLoopState.Stop() when possible, since it terminates more quickly.  This is particularly useful in situations where you are searching for an element or a condition in the collection.  Once you’ve found it, you do not need to do any other processing, so Stop() is more appropriate. Use ParallelLoopState.Break() if you need to more closely match the behavior of the C# break statement. Both methods behave differently than our C# break statement.  Unfortunately, when parallelizing a routine, more thought and care needs to be put into every aspect of your routine than you may otherwise expect.  This is due to my second observation: Parallelizing a routine will almost always change its behavior. This sounds crazy at first, but it’s a concept that’s so simple its easy to forget.  We’re purposely telling the system to process more than one thing at the same time, which means that the sequence in which things get processed is no longer deterministic.  It is easy to change the behavior of your routine in very subtle ways by introducing parallelism.  Often, the changes are not avoidable, even if they don’t have any adverse side effects.  This leads to my final observation for this post: Parallelization is something that should be handled with care and forethought, added by design, and not just introduced casually.

    Read the article

< Previous Page | 563 564 565 566 567 568 569 570 571 572 573 574  | Next Page >