如何为每个循环创建和调用方法(使用线程C#)?

时间:2011-05-09 06:42:44

标签: multithreading visual-studio-2008

我想在线程中调用我的自定义方法。

 public void LoopOverAllLists(String _webAndSiteXml)
    {
        try
        {

            XmlNode _nodelist = SharePoint.ListsGetListCollection();

            foreach (System.Xml.XmlNode _item in _nodelist.ChildNodes)
            { 

                string title = _item.Attributes["Title"].Value;
                //check for hidden list
                if (_item.Attributes["Hidden"].Value.ToLower() == "false")
                {
                    switch (_item.Attributes["ServerTemplate"].Value)
                    {
                        //Check whether list is document library  
                        case SharePoint.LIST_ID_DOCUMENT_LIBRARY:
                        case SharePoint.LIST_ID_XML_FORMS:
                        case SharePoint.Publishing_ID_Pages:
                            {
                                //Get all documents info
                                try
                                {

                                    GetAllDocumentsInfo(_item, _webAndSiteXml);

                                }
                                catch
                                {

                                }

                                break;
                            }
                        //Check whether list is having attachment
                        case SharePoint.LIST_ID_GENERIC:
                        case SharePoint.LIST_ID_ANNOUNCEMENTS:
                        case SharePoint.LIST_ID_CONTACTS:
                        case SharePoint.LIST_ID_TASKS:
                        case SharePoint.LIST_ID_EVENTS:
                        case SharePoint.LIST_ID_CUSTOM_GRID:
                        case SharePoint.LIST_ID_MEETING_SERIES:
                        case SharePoint.LIST_ID_MEETING_AGENDA:
                        case SharePoint.LIST_ID_MEETING_ATTENDEES:
                        case SharePoint.LIST_ID_MEETING_DECISIONS:
                        case SharePoint.LIST_ID_MEETING_OBJECTIVES:
                        case SharePoint.LIST_ID_MEETING_TTB:
                        case SharePoint.LIST_ID_MEETING_WS_PAGES:
                        case SharePoint.LIST_ID_PORTAL_SITE_LIST:
                            {
                                //Get all list items info having attachment 
                                try
                                {
                                    GetAllListItemsInfoOnlyAttachments(_item, _webAndSiteXml);
                                }
                                catch
                                {

                                }

                                break;

                            }
                        default:
                            GetAllListItemsInfoOnlyAttachments(_item, _webAndSiteXml);
                            break;

                    }
                    // Get All the List Forms  
                    try
                    {
                        GetAllListForms(title, _webAndSiteXml);
                    }
                    catch
                    {

                    }

                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

在上面的方法中有三个方法是“GetAllDocumentsInfo,GetAllListItemsInfoOnlyAttachments和GetAllListForms”我想用C#中的线程调用这些函数。

由于

2 个答案:

答案 0 :(得分:1)

而不是打电话

GetAllDocumentsInfo(_item, _webAndSiteXml);

使用

Task.Factory.StartNew(() => GetAllDocumentsInfo(_item, _webAndSiteXml));

为其他方法调用重复此模式

答案 1 :(得分:1)

以下是我如何处理这个问题。请注意,我将foreach循环的内容封装到一个单独的方法中,然后将该方法的执行排队到ThreadPool中,以便循环的每次迭代并行发生。我还使用完善的模式来等待所有待处理的工作项完成。此代码与.NET 3.5兼容。

public void LoopOverAllLists(String _webAndSiteXml)
{
  int pending = 1; // Used to track the number of pending work items.
  var finished = new ManualResetEvent(false); // Used to wait for all work items to complete.
  XmlNode nodes = SharePoint.ListsGetListCollection();
  foreach (XmlNode item in nodes)
  {
    XmlNode capture = item; // This is required to capture the loop variable correctly.
    Interlocked.Increment(ref pending); // There is another work item in progress.
    ThreadPool.QueueUserWorkItem(
      (state) =>
      {
        try
        {
          ProcessNode(capture);
        }
        finally
        {
          // Signal the event if this is the last work item to complete.
          if (Interlocked.Decrement(ref pending) == 0) finished.Set();
        }
      }, null);
  }
  // Signal the event if the for loop was last work item to complete.
  if (Interlocked.Decrement(ref pending) == 0) finished.Set();
  // Wait for all work items to complete.
  finished.WaitOne();
}

private void ProcessNode(XmlNode item)
{
  // Put the contents of your loop here.
}